PHP 實現插入 選擇 冒泡 快速排序演算法

2021-04-13 23:08:39 字數 3716 閱讀 4927

php實現插入、選擇、冒泡、快速排序演算法

// author:lucas  date:2007.11.14

<?php

/*【插入排序(一維陣列)】

【基本思想】:每次將乙個待排序的資料元素,插入到前面已經排好序的數列中的適當位置,使數列依然有序;直到待排序資料元素全部插入完為止。

【示例】:

[初始關鍵字] [49] 38 65 97 76 13 27 49

j=2(38) [38 49] 65 97 76 13 27 49

j=3(65) [38 49 65] 97 76 13 27 49

j=4(97) [38 49 65 97] 76 13 27 49

j=5(76) [38 49 65 76 97] 13 27 49

j=6(13) [13 38 49 65 76 97] 27 49

j=7(27) [13 27 38 49 65 76 97] 49

j=8(49) [13 27 38 49 49 65 76 97]

*/function insert_sort($arr)

}return $arr;}

/*【選擇排序(一維陣列)】

【基本思想】:每一趟從待排序的資料元素中選出最小(或最大)的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。

【示例】:

[初始關鍵字] [49 38 65 97 76 13 27 49]

第一趟排序後 13 [38 65 97 76 49 27 49]

第二趟排序後 13 27 [65 97 76 49 38 49]

第三趟排序後 13 27 38 [97 76 49 65 49]

第四趟排序後 13 27 38 49 [49 97 65 76]

第五趟排序後 13 27 38 49 49 [97 97 76]

第六趟排序後 13 27 38 49 49 76 [76 97]

第七趟排序後 13 27 38 49 49 76 76 [ 97]

最後排序結果 13 27 38 49 49 76 76 97

*/function select_sort($arr)

if($k != $i)

}return $arr;}

/*【氣泡排序(一維陣列) 】

【基本思想】:兩兩比較待排序資料元素的大小,發現兩個資料元素的次序相反時即進行交換,直到沒有反序的資料元素為止。

【排序過程】:設想被排序的陣列r[1..n]垂直豎立,將每個資料元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,

從下往上掃瞄陣列r,凡掃瞄到違反本原則的輕氣泡,就使其向上"漂浮",如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止。

【示例】:

49 13 13 13 13 13 13 13

38 49 27 27 27 27 27 27

65 38 49 38 38 38 38 38

97 65 38 49 49 49 49 49

76 97 65 49 49 49 49 49

13 76 97 65 65 65 65 65

27 27 76 97 76 76 76 76

49 49 49 76 97 97 97 97

*/function bubble_sort($array)

} }

return $array; }

/*【快速排序(一維陣列)】

【基本思想】:在當前無序區r[1..h]中任取乙個資料元素作為比較的"基準"(不妨記為x),

用此基準將當前無序區劃分為左右兩個較小的無序區:r[1..i-1]和r[i 1..h],且左邊的無序子區中資料元素均小於等於基準元素,

右邊的無序子區中資料元素均大於等於基準元素,而基準x則位於最終排序的位置上,即r[1..i-1]≤x.key≤r[i 1..h](1≤i≤h),

當r[1..i-1]和r[i 1..h]均非空時,分別對它們進行上述的劃分過程,直至所有無序子區中的資料元素均已排序為止。

【示例】:

初始關鍵字 [49 38 65 97 76 13 27 49]

第一次交換後 [27 38 65 97 76 13 49 49]

第二次交換後 [27 38 49 97 76 13 65 49]

j向左掃瞄,位置不變,第三次交換後 [27 38 13 97 76 49 65 49]

i向右掃瞄,位置不變,第四次交換後 [27 38 13 49 76 97 65 49]

j向左掃瞄 [27 38 13 49 76 97 65 49]

(一次劃分過程)

初始關鍵字 [49 38 65 97 76 13 27 49]

一趟排序之後 [27 38 13] 49 [76 97 65 49]

二趟排序之後 [13] 27 [38] 49 [49 65]76 [97]

三趟排序之後 13 27 38 49 49 [65]76 97

最後的排序結果 13 27 38 49 49 65 76 97

各趟排序之後的狀態

*/function quick_sort($array)

/*列印陣列全部內容*/

function display_arr($array)

echo '';}

/*幾種排序演算法的比較和選擇

1. 選取排序方法需要考慮的因素:

(1) 待排序的元素數目n;

(2) 元素本身資訊量的大小;

(3) 關鍵字的結構及其分布情況;

(4) 語言工具的條件,輔助空間的大小等。

2. 小結:

(1) 若n較小(n <= 50),則可以採用直接插入排序或直接選擇排序。由於直接插入排序所需的記錄移動操作較直接選擇排序多,因而當記錄本身資訊量較大時,用直接選擇排序較好。

(2) 若檔案的初始狀態已按關鍵字基本有序,則選用直接插入或氣泡排序為宜。

(3) 若n較大,則應採用時間複雜度為o(nlog2n)的排序方法:快速排序、堆排序或歸併排序。 快速排序是目前基於比較的內部排序法中被認為是最好的方法。

(4) 在基於比較排序方法中,每次比較兩個關鍵字的大小之後,僅僅出現兩種可能的轉移,因此可以用一棵二叉樹來描述比較判定過程,由此可以證明:當檔案的n個關鍵字隨機分布時,任何借助於"比較"的排序演算法,至少需要o(nlog2n)的時間。

(5) 當記錄本身資訊量較大時,為避免耗費大量時間移動記錄,可以用鍊錶作為儲存結構。*/

/*排序測試*/

$a = array('12','4','16','8','13','20','5','32');

echo 'the result of insert sort:';

$insert_a = insert_sort($a);

display_arr($insert_a);

echo 'the result of select sort:';

$select_a = select_sort($a);

display_arr($select_a);

echo 'the result of bubble sort:';

$bubble_a = bubble_sort($a);

display_arr($bubble_a);

echo 'the result of bubble sort:';

$quick_a  = quick_sort($a);

display_arr($quick_a);

?>

PHP實現插入 選擇 冒泡 快速排序演算法

插入排序 一維陣列 基本思想 每次將乙個待排序的資料元素,插入到前面已經排好序的數列中的適當位置,使數列依然有序 直到待排序資料元素全部插入完為止。示例 初始關鍵字 49 38 65 97 76 13 27 49 j 2 38 38 49 65 97 76 13 27 49 j 3 65 38 49...

冒泡 插入 選擇 快速排序

各位親 有時間可以去看看我的 金駿家居 店 買時說明在我的部落格看到有優惠哦 還有意外禮品贈送 真正的程式設計師 店 氣泡排序 每次找出最大或者最小的數放到序列的最後。插入排序 每一次查詢都把數放到已排序序列合適的位置。例子 4,3,2,1如數中的第乙個數肯定是有序的,從第二個數開始3小於4,放在已...

排序 快速,插入,選擇,冒泡

快速排序 陣列快速排序 先取出陣列第乙個 把每個和它比較,比它小的放在l陣列,大的放r陣列,一直比較,最後合到乙個陣列 function kuaisu a l r array for i 1 i c i else l kuaisu l r kuaisu r return array merge l,...