排序演算法在程式設計中經常會遇見,本文將透過php來實作幾種常見的排序演算法。
一、冒泡排序
冒泡排序理解起來是最簡單,但是時間複雜度(O(n^2))也是最大的之一,實作程式碼如下:
function bubbleSort($arr) { $len = count($arr); for ($i = 0; $i < $len; $i++) { // 遍历i后面的元素,只要该元素小于当前元素,就把较小的往前冒泡 for ($j = $i + 1; $j < $len; $j++) { if ($arr[$i] > $arr[$j]) { $t = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $t; } } } return $arr; } $arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8]; print_r(bubbleSort($arr));
二、選擇排序
選擇排序理解起來也比較簡單,時間複雜度也是O(n^2),實作程式碼如下:
function selectSort($arr) { $len = count($arr); for ($i = 0; $i < $len; $i++) { $minIndex = $i; // 找出i后面最小的元素与当前元素交换 for ($j = $i + 1; $j < $len; $j++) { if ($arr[$j] < $arr[$minIndex]) { $minIndex = $j; } } if ($minIndex != $i) { $t = $arr[$i]; $arr[$i] = $arr[$minIndex]; $arr[$minIndex] = $t; } } return $arr; } $arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8]; print_r(bubbleSort($arr));
三、插入排序
感覺插入排序跟冒泡排序有點相似,時間複雜度也是O(n^2),實作程式碼如下:
function insertSort($arr) { $len = count($arr); for ($i = 1; $i < $len; $i++) { if ($arr[$i] < $arr[$i - 1]) { $t = $arr[$i]; $j = $i - 1; // 如果当前元素大于前一个元素,就往前挪 while ($j >= 0 && $t < $arr[$j]) { $arr[$j + 1] = $arr[$j]; $j--; } $arr[$j + 1] = $t; } } return $arr; } $arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8]; print_r(bubbleSort($arr));
四、希爾排序
#希爾排序其實可以理解是插入排序的最佳化版,它的效率跟增量有關,增量要取多少,根據不同的陣列是不同的,所以希爾排序是一個不穩定的排序演算法,它的時間複雜度為O(nlogn)到O(n^2)之間,實作程式碼如下:
function shellSort($arr) { $len = count($arr); $stepSize = floor($len / 2); while ($stepSize >= 1) { for ($i = $stepSize; $i < $len; $i++) { if ($arr[$i] < $arr[$i - $stepSize]) { $t = $arr[$i]; $j = $i - $stepSize; while ($j >= 0 && $t < $arr[$j]) { $arr[$j + $stepSize] = $arr[$j]; $j -= $stepSize; } $arr[$j + $stepSize] = $t; } } // 缩小步长,再进行插入排序 $stepSize = floor($stepSize / 2); } return $arr; } $arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8]; print_r(bubbleSort($arr));
五、堆排序
堆排序是一種高效率的排序演算法,它的時間複雜度是O(nlogn)。原理是:先把陣列轉為一個最大堆,然後把第一個元素跟第i元素交換,然後把剩下的i-1個元素轉為最大堆,然後再把第一個元素與第i元素交換,然後把剩下的i-1個元素轉為最大堆,然後再把第一個元素與第i- 1個元素交換,以此類推。實作程式碼如下:function heapSort($arr) {
$len = count($arr); // 先建立最大堆 for ($i = floor(($len - 1) / 2); $i >= 0; $i--) { $s = $i; $childIndex = $s * 2 + 1; while ($childIndex < $len) { // 在父、左子、右子中 ,找到最大的 if ($childIndex + 1 < $len && $arr[$childIndex] < $arr[$childIndex + 1]) $childIndex++; if ($arr[$s] < $arr[$childIndex]) { $t = $arr[$s]; $arr[$s] = $arr[$childIndex]; $arr[$childIndex] = $t; $s = $childIndex; $childIndex = $childIndex * 2 + 1; } else { break; } } } // 从最后一个元素开始调整 for ($i = $len - 1; $i > 0; $i--) { $t = $arr[$i]; $arr[$i] = $arr[0]; $arr[0] = $t; // 调整第一个元素 $s = 0; $childIndex = 1; while ($childIndex < $i) { // 在父、左子、右子中 ,找到最大的 if ($childIndex + 1 < $i && $arr[$childIndex] < $arr[$childIndex + 1]) $childIndex++; if ($arr[$s] < $arr[$childIndex]) { $t = $arr[$s]; $arr[$s] = $arr[$childIndex]; $arr[$childIndex] = $t; $s = $childIndex; $childIndex = $childIndex * 2 + 1; } else { break; } } } return $arr; } $arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8]; print_r(bubbleSort($arr));
六、快速排序
快排也是一個高效率的排序演算法,它的時間複雜度也是O(nlogn)。原理是:選擇一個基準元素,然後把陣列中小於這個元素的元素放在基準元素左邊,大於它的,放在基準元素右邊。然後對這兩邊繼續同樣的操作。程式碼如下:
function quickSort($arr) { $len = count($arr); quickSortRecursion($arr, 0, $len - 1); return $arr; } function quickSortRecursion(&$arr, $begin, $end) { if ($begin < $end) { $left = $begin; $right = $end; $temp = $arr[$begin];// $temp为基准元素 // 把小于$temp的元素放到$temp左边,大于它的放在右边 while ($left < $right) { while ($left < $right && $arr[$right] >= $temp) $right--; if ($left < $right) { $arr[$left++] = $arr[$right]; } while ($left < $right && $arr[$left] <= $temp) $left++; if ($left < $right) { $arr[$right--] = $arr[$left]; } } $arr[$left] = $temp; // 把数组分成两部分,递归调用该函数 quickSortRecursion($arr, $begin, $left - 1); quickSortRecursion($arr, $left + 1, $end); } return $arr; } $arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8]; print_r(bubbleSort($arr));
七、歸併排序
歸併排序的時間複雜度也是O(nlogn)。原理是:對於兩個排序好的數組,分別遍歷這兩個數組,而取得較小的元素插入新的數組中,那麼,這麼新的數組也會是排序好的。程式碼如下:
function mergeSort($arr) { $len = count($arr); $arr = mergeSortRecursion($arr, 0, $len - 1); return $arr; } function mergeSortRecursion(&$arr, $begin, $end) { if ($begin < $end) { $mid = floor(($begin + $end) / 2); // 把数组不断拆分,只到只剩下一个元素,对于一个元素的数组,一定是排序好的 mergeSortRecursion($arr, $begin, $mid); mergeSortRecursion($arr, $mid + 1, $end); $i = $begin; $j = $mid + 1; $k = 0; $temp = array(); // 开始执行归并,遍历两个数组,从它们里面取较小的元素插入到新数组中 while ($i <= $mid && $j <= $end) { if ($arr[$i] < $arr[$j]) { $temp[$k++] = $arr[$i++]; } else { $temp[$k++] = $arr[$j++]; } } while ($i <= $mid) { $temp[$k++] = $arr[$i++]; } while ($j <= $end) { $temp[$k++] = $arr[$j++]; } for ($i = 0; $i < $k; $i++) { $arr[$i + $begin] = $temp[$i]; } } return $arr; } $arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8]; print_r(bubbleSort($arr));
本文詳解使用php程式實作排序演算法,跟多相關內容請注意php中文網。
相關推薦:
以上是使用php寫出幾種常見的排序演算法程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!