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

2021-05-22 20:30:47 字數 3378 閱讀 7306

/*

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

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

【示例】:

[初始關鍵字] [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] */

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

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

【示例】:

[初始關鍵字] [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*/

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

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

【排序過程】:設想被排序的陣列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 */

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

【基本思想】:在當前無序區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 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 實現插入 選擇 冒泡 快速排序演算法

php實現插入 選擇 冒泡 快速排序演算法 author lucas date 2007.11.14 插入排序 一維陣列 基本思想 每次將乙個待排序的資料元素,插入到前面已經排好序的數列中的適當位置,使數列依然有序 直到待排序資料元素全部插入完為止。示例 初始關鍵字 49 38 65 97 76 1...

冒泡 插入 選擇 快速排序

各位親 有時間可以去看看我的 金駿家居 店 買時說明在我的部落格看到有優惠哦 還有意外禮品贈送 真正的程式設計師 店 氣泡排序 每次找出最大或者最小的數放到序列的最後。插入排序 每一次查詢都把數放到已排序序列合適的位置。例子 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,...