常用排序演算法

2021-09-28 00:08:03 字數 3445 閱讀 4827

插入:

直接插入。前有序後無序,有序依此插無序。

交換:直接交換。前有序後無序,無序min 入有序。

冒泡交換。前無序後有序。無序max 入有序。

快排。設標兵,挖坑,填坑。使左邊都比標兵小,右邊都比標兵大。

歸併:翻倍每次排序量,初始為2。

shell:縮小增量。初始增量n/

2。堆排序:取前n,建大根堆,交換根與葉子最右。取前n-

1再建堆。

直插,冒泡,歸併穩定。

堆,歸併,快排,nlogn。

//插入排序  遍歷無序序列,將無序元素插入有序序列中

void

insert_sort

(vector<

int> a)

// a[1] = a[0];

// 此時 j = -1;

a[++j]

= tmp;

}for

(auto i:a)

cout << i <<

",";

}

// 選擇排序    遍歷a[1]-a[n] 交換,使a[0]為min

// 每次選最小的 5 8 5 2 9 2和5交換 前5 變 後5 不穩定

void

choose_sort

(vector<

int> a)}}

for(

auto i:a)

}

// 冒泡  穩定   交換相鄰兩數,  使max在最後

// 每一躺,在前面的無序中 冒乙個max到最後

void

bubbling_sort

(vector<

int> a)}}

for(

auto i:a)

cout <

}

#include

using

namespace std;

void

quick_sort

(int a,

int l,

int r)

a[hole]

= a[right]

; hole = right;

//坑的位置

while

(a[left]

< tmp && left

a[hole]

= a[left]

; hole = left;

//坑的位置

}//此時left == right == hole 填坑

a[hole]

= tmp;

if(l < hole-1)

if(hole+

1< r)

}int

main()

;quick_sort

(a,0,9

);for(

int i=

0; i<

10; i++

)return0;

}

//歸併排序

//初始狀態:6,202,100,301,38,8,1

//第一次歸併後:,,,,比較次數:3;

//第二次歸併後:,,比較次數:4;

//第三次歸併後:,比較次數:4;

//總的比較次數為:3+4+4=11;

void

merge

(int sourcearr,

int temparr,

int startindex,

int midindex,

int endindex)

while

(i != midindex+1)

temparr[k++

]= sourcearr[i++];

while

(j != endindex+1)

temparr[k++

]= sourcearr[j++];

for(i=startindex; i<=endindex; i++

) sourcearr[i]

= temparr[i];}

//內部使用遞迴

void

mergesort

(int sourcearr,

int temparr,

int startindex,

int endindex)

}

//希爾排序 縮小增量排序

// 增量:: 相隔較遠兩數的距離

// 增量: sum = 10 5,2,1 sum = 11 5,2,1 tag

void

shell_sort

(int a,

int len)

// else

// }

for(

int j=i-gap; j>=

0&& a[j]

>a[j+gap]

; j=j-gap)}}

for(

int i=

0;i)}

shell排序如下圖 當a[j]>a[j+gap] //3<9 3之前gap為2的數必然是遞增的,不必再執行最裡層的for迴圈

//堆排序

//建堆

// 假設已經有了n個資料,那麼新資料自然放在n位(因為位置是從0開始)

// 將新資料與 (n-1)/2 位置的資料(新資料的父節點)比較,如果比父節點大,那麼就交換,繼續比較,直到它比父節點小。 就插入完成

// 依此插入 完成建堆

void

make_heap_c

(int a,

int len)}}

}void

heap_sort_c

(int a,

int size)

for(

int i=

0; i

)}

void

heap_sort

(vector<

int>

& a)

for(

auto tmp:a)

cout << tmp << endl;

}

常用排序演算法

筆者最近學習演算法,學了很久也只弄懂了幾個排序演算法,在這裡曬一下下,作為以後參考之用。一 為什麼要研究排序問題 許多計算機科學家認為,排序演算法是演算法學習中最基本的問題,原因有以下幾點 l有時候應用程式本身需要對資訊進行排序,如為了準備客戶賬目,銀行需要對支票賬號進行排序 l很多演算法將排序作為...

常用排序演算法

一 簡單排序演算法 由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行 並在我的vc環境 下執行通過。因為沒有涉及mfc和windows的內容,所以在borland c 的平台上應該也不會有什麼 問題的。在 的後面給出了執行過程示意,希望對理解有幫助。1.冒泡法 這是最原始,也是眾所...

常用排序演算法

排序演算法 最好時間 平均時間 最壞時間 輔助空間 穩定性 直接插入排序 o n o n 2 o n 2 o 1 穩定 希爾排序 o n 1.3 o 1 不穩定 直接選擇排序 o n 2 o n 2 o n 2 o 1 不穩定 堆排序 o n x lbn o n x lbn o n x lbn o ...