所有排序總結(內排序)

2022-03-11 18:17:40 字數 2723 閱讀 2157

花時間把所有的排序重新 寫了一遍。。。。。(應該是認真寫過一遍,學的時候根本就沒寫過)

寫得時候才發現,理解不深刻。基本上 只是懂怎麼做,不懂為什麼。

把我寫得記在這裡,以後用得著了回來看看。

暫時就到這裡吧,以後有時間,繼續研究這些東西。在寫出來。

三個o(n2)的演算法

選擇排序:

1

void selectionsort(int *a,intn)2

10 }

氣泡排序:

1

void bubblesort(int *a,intn)2

插入排序:

1

void insertsort(int *a,intn)2

12 a[j] = tmp;//

1 2 3 5 6 7 4 ==> 1 2 3 4 5 6 713}

14 }

下面幾個高階的演算法。。。  有些把我折騰的夠慘。。。debug 幾個小時 才弄出來。  (鄙視自己。。)

希爾排序:

1

void shellsort(int *a,intn)2

15}16 }

歸併排序:

1

void merge(int *array,int *tmp,int start,int center,int end)//

合併的程式。215

while(s<=c-1

)16 tmp[i++] = array[s++];

17while(c<=end)

18 tmp[i++] = array[c++];

19for(i=start;i)

20 array[i] = tmp[i-start];21}

22void mergesort(int *a,int *tmp,int start,int

end)

2332 }

歸併的乙個改進。。。。。改進不大   參照某本書上來的

1

void merge(int *array,int *tmp,int start,int center,int end)//

合併的程式。2//

改進的部分

然後就是傳說中的快排了

快速排序 hoare版      參照某博文   july的快速排序分析。

1

int hoarepartition(int *a,int p,intr)2

while(a[j]>x);//

找到小於等於的

13do

14while(a[i]//

找到大於等於的

17if(i18 swap(&a[i],&a[j]);

19else

20return

j;21}22

}23/*用do while 的原因

*/24

/*如果data陣列有相同元素就可能陷入死迴圈,比如:

252 3 4 5 6 2

26l->| |<-h

2728

交換l和h單元後重新又回到:

292 3 4 5 6 2

30l->| |<-h

3132

而第乙個程式不存在這種情況,因為它總是在l和h調整後比較,也就是l終究會大於等於h。

33*/

34void quicksort(int *a,int p,int

r)35

43 }

快速排序hoare變形版

1

int hoarepartition_1(int *a,int p,intr)2

14 a[i] =x;

15return

i;16}17

void quicksort(int *a,int p,int

r)18

26 }

快速排序  演算法導論版

1

int partition(int *a,int p,intr)2

13}14 swap(&a[i+1],&a[r]);

15return i+1;16

}17void quicksort(int *a,int p,int

r)18

25 }

囉嗦一句就是,快排 裡面的partition  的返回值一定要搞明白。。。。。

這個幾個快速排序 都是參照 july 的博文來的。。。 感謝他。

最後  

堆排序:(莫名其妙 除錯了很久。。。。。。)

1

void buildmaxheap(int *heap,int num)//

建大頂堆 完全二叉樹陣列存放220

21if(heap[i]22 swap(&heap[i],&heap[maxchild]);23}

24}25void heapsort(int *heap,int

n)26

32 }

恩,歸併的遞迴  堆排序   都糾結了較長時間

有時間,我還要把遞迴好好看一看。。。。。

注:這上面的swap和測試的**   我就沒貼了

所有排序總結(內排序)(續) 線性時間排序

一 前言 這裡稍微證明一下基於比較的排序演算法的下界,採用決策樹模型。下圖是乙個含三個元素的輸入序列,採用插入排序演算法的決策樹。每乙個結點裡面包含 i,j 左子樹代表i j的情況,右子樹代表i j的情況。各位,如果有跟我一樣,半天看不懂的話,我就稍微解釋一下。拿 1,2,3 這個序列的得出,稍作說...

內排序演算法總結 快速排序

快速排序 快速排序是一種在含n個數的輸入陣列上最壞情況執行時間為o n2 的演算法,平均效能的期望執行時間為o nlgn 且o nlgn 記號中隱含的常數因子很小。另外,它還能夠進行原地置換排序。快速排序是基於分治模式上的,分治過程三個步驟 1.分解 把陣列a p.r 分成兩個非空子陣列a p.q ...

內排序方法總結

1 include 2 3using namespace std 45 typedef int elementtype 67 8 插入排序 時間複雜度o n 9 void insertionsort elementtype a,int n 1021 2223 2425 希爾排序 特殊的插入排序 26...