冒泡排序
- 兩兩比較相鄰記錄的關鍵字,若是反序則交換,大的數字往下沉,一直到最大的出如今數組最後
function swap(&$x, &$y) {
$temp = $x;
$x = $y;
$y = $temp;
}
function bubble_sort(&$arr) {//php的陣列視為基本型別,因此必須用傳參考才能修改原陣列
for ($i = 0; $i < count($arr) - 1; $i++) { //控制循環的次數
for ($j = 0; $j < count($arr) - 1 - $i; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
swap($arr[$j], $arr[$j + 1]);
}
}
}
}
改進的冒泡排序
- 第一層循環不變,第二層循環冒泡變成從後往前,這樣作能夠在冒泡的過程當中儘量的將小的數據向前冒。
function bubble_sort(&$arr)
{
for ($i=0;$i<count($arr);$i++) {
for ($j=count($arr)-1;$j>$i;$j--) {
if ($arr[$j-1]>$arr[j]) {
swap($arr[j-1],$arr[j]);
}
}
}
}
插入排序
function insertion_sort(&$arr)
{//php的陣列視為基本型別,因此必須用傳參考才能修改原陣列
for ($i = 1; $i < count($arr); $i++) {
$temp = $arr[$i];
for ($j = $i - 1; $j >= 0 && $arr[$j] > $temp; $j--) {
$arr[$j + 1] = $arr[$j];
}
$arr[$j + 1] = $temp;
}
}
選擇排序
- 經過n-i次關鍵字的比較,找出n-i+1個記錄中最小的記錄,並和第i個記錄交換
function select_sort(&$arr)
{
for ($i = 0;$i < count($arr);$i++) {
$min = $i;
for ($j = count($arr)-1;$j > $i;$j--) {
if ($arr[$j] < $arr[$min]) {
$min = $j;
}
}
if ($min != $i) {
swap($arr[$i],$arr[$min]);
}
}
}
爲何插入排序比冒泡排序好
- 兩個算法的時間複雜度都是O(n^2),可是冒泡排序每次交換記錄時都要進行三次賦值操做,而插入排序由於有哨兵變量,因此只有一步賦值操做,減小了排序時間。
總結
- 比較排序算法都是空間複雜度爲O(1)的原地排序算法,其中冒泡排序和插入排序兩兩比較不會交換相等的記錄,因此這兩種排序都是穩定排序,而選擇排序只是記錄最小值最後進行交換,因此會破壞相對順序,選擇排序不是穩定算法。