基本排序演算法

2022-07-03 01:54:09 字數 3708 閱讀 1007

插入排序

演算法描述:

1. 從第乙個元素開始,該元素可以認為已經被排序

2. 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

3. 如果該元素(已排序)大於新元素,將該元素移到下一位置

4. 重複步驟 3,直到找到已排序的元素小於或者等於新元素的位置

5. 將新元素插入到該位置後

6. 重複步驟 2~5

現有一組陣列 arr = [5, 6, 3, 1, 8, 7, 2, 4][

5] 631

8724

//第乙個元素被認為已經被排序

[5,6] 318

724//

6與5比較,放在5的右邊

[3,5,6] 187

24//3與6和5比較,都小,則放入陣列頭部

[1,3,5,6] 872

4//1與3,5,6比較,則放入頭部

[1,3,5,6,8] 724

[1,3,5,6,7,8] 24[

1,2,3,5,6,7,8] 4

[1,2,3,4,5,6,7,8]

程式設計思路:雙層迴圈,外迴圈控制未排序的元素,內迴圈控制已排序的元素,將未排序元素設為標桿,與已排序的元素進行比較,小於則交換位置,大於則位置不動

function insertsort(arr)

else}}

return

arr}

選擇排序

演算法描述:直接從待排序陣列中選擇乙個最小(或最大)數字,放入新陣列中。

[1] 563

8724

[1,2] 563

874[

1,2,3] 568

724[

1,2,3,4] 568

7[1,2,3,4,5] 687

[1,2,3,4,5,6] 87[

1,2,3,4,5,6,7] 8

[1,2,3,4,5,6,7,8]

程式設計思路:先假設第乙個元素為最小的,然後通過迴圈找出最小元素,然後同第乙個元素交換,接著假設第二個元素,重複上述操作即可

function selectsort(array) 

}//交換位置

temp =array[i];

array[i] =minvalue;

array[minindex] =temp;

} return

array

}

歸併排序

演算法描述:

1. 把 n 個記錄看成 n 個長度為 l 的有序子表

2. 進行兩兩歸併使記錄關鍵字有序,得到 n/2 個長度為 2 的有序子表

3. 重複第 2 步直到所有記錄歸併成乙個長度為 n 的有序表為止。

563

1872

4[5,6] [3,1] [8,7] [2,4][

5,6] [1,3] [7,8] [2,4][

5,6,1,3] [7,8,2,4][

1,3,5,6] [2,4,7,8][

1,2,3,4,5,6,7,8]

程式設計思路:將陣列一直等分,然後合

function merge(left, right) 

return

tmp.concat(left, right);

}function mergesort(a)

快速排序

演算法描述:

在資料集之中,選擇乙個元素作為」基準」(pivot)。

所有小於」基準」的元素,都移到」基準」的左邊;所有大於」基準」的元素,都移到」基準」的右邊。這個操作稱為分割槽 (partition)操作,分割槽操作結束後,基準元素所處的位置就是最終排序後它的位置。

對」基準」左邊和右邊的兩個子集,不斷重複第一步和第二步,直到所有子集只剩下乙個元素為止。

563

1872

4pivot|5

6319

724|storeindex56

3197

24//將5同6比較,大於則不更換

|storeindex36

5197

24//將5同3比較,小於則更換

|storeindex36

1597

24//將5同1比較,小於則不更換

|storeindex

...361

4972

5//將5同4比較,小於則更換

|storeindex36

1457

29//將標準元素放到正確位置

|storeindex pivot

上述講解了分割槽的過程,然後就是對每個子區進行同樣做法

function quicksort(arr)

else

}return

quicksort(left).concat([tmp],quicksort(right))

}

上述版本會造成堆疊溢位,所以建議使用下面版本

原地分割槽版:主要區別在於先進行分割槽處理,將陣列分為左小右大

function quicksort(arr)

function partition(arr,left,right)

}swap(arr,right,storeindex);

return storeindex//

返回標桿元素的索引值

} function sort(arr,left,right)

sort(arr,

0,arr.length-1

);

return

arr;

}

氣泡排序

演算法描述:

1. 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

3. 針對所有的元素重複以上的步驟,除了最後乙個。

4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

563

1872

4[56] 318

724//

比較5和6

5 [6

3] 187

2453 [6

1] 872

4531 [6

8] 724

5316 [8

7] 245

3167 [8

2] 453

1672 [84]

5316

7248

//這樣最後乙個元素已經在正確位置,所以下一次開始時候就不需要再比較最後乙個

程式設計思路:外迴圈控制需要比較的元素,比如第一次排序後,最後乙個元素就不需要比較了,內迴圈則負責兩兩元素比較,將元素放到正確位置上

function bubblesort(arr)}}

return

arr;

}

基本排序排序演算法

時空複雜度 氣泡排序 時間o n 2 額外空間o 1 插入排序 時間o n 2 額外空間o 1 選擇排序 時間o n 2 額外空間o 1 基數排序 時間o k n k logn max 額外空間o n 臨時儲存 o b 記數,b為基的大小 記數排序 時間o n k 額外空間o k 希爾排序 時間o ...

基本排序排序演算法

時空複雜度 氣泡排序 時間o n 2 額外空間o 1 插入排序 時間o n 2 額外空間o 1 選擇排序 時間o n 2 額外空間o 1 基數排序 時間o k n k logn max 額外空間o n 臨時儲存 o b 記數,b為基的大小 記數排序 時間o n k 額外空間o k 希爾排序 時間o ...

基本排序演算法

將要排序的物件分作兩部份,乙個是已排序的,乙個是未排序的,從後端未排序部份選擇乙個最小值,並放入前端已排序部份的最後乙個,例如 排序前 70 80 31 37 10 1 48 60 33 80 1 80 31 37 10 70 48 60 33 80 選出最小值1 1 10 31 37 80 70 ...