花時間把所有的排序重新 寫了一遍。。。。。(應該是認真寫過一遍,學的時候根本就沒寫過)
寫得時候才發現,理解不深刻。基本上 只是懂怎麼做,不懂為什麼。
把我寫得記在這裡,以後用得著了回來看看。
暫時就到這裡吧,以後有時間,繼續研究這些東西。在寫出來。
三個o(n2)的演算法
選擇排序:
1void selectionsort(int *a,intn)2
10 }
氣泡排序:
1void bubblesort(int *a,intn)2
插入排序:
1void 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 幾個小時 才弄出來。 (鄙視自己。。)
希爾排序:
1void shellsort(int *a,intn)2
15}16 }
歸併排序:
1void 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 }
歸併的乙個改進。。。。。改進不大 參照某本書上來的
1void merge(int *array,int *tmp,int start,int center,int end)//
合併的程式。2//
改進的部分
然後就是傳說中的快排了
快速排序 hoare版 參照某博文 july的快速排序分析。
1int 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變形版
1int 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 }
快速排序 演算法導論版
1int 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 的博文來的。。。 感謝他。
最後
堆排序:(莫名其妙 除錯了很久。。。。。。)
1void 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...