以上快速排序和歸併排序的空間複雜度不正確
圖2沒有的參考圖1,以圖2為準(對,就是懶得重新畫圖了)
排序法最差時間分析
平均時間複雜度
穩定度
空間複雜度
氣泡排序
o(n2)
o(n2)
穩定 o(1)
快速排序
o(n2)
o(n*log2n)
不穩定
o(log2n)~o(n)
選擇排序
o(n2)
o(n2)
穩定 o(1)
二叉樹排序
o(n2)
o(n*log2n)
不穩定
o(n)
插入排序
o(n2)
o(n2)
穩定 o(1)
堆排序o(n*log2n)
o(n*log2n)
不穩定
o(1)
希爾排序oo
不穩定
o(1)
1.插入排序
由n-1趟排序組成,對於p=1到p=n-1趟,插入排序保證從位置0到位置p上的元素為已排序狀態。
時間複雜度:o(n^2)
**void insertionsort(elementtype a,int n)
a[j]=tmp;}}
2.希爾排序
希爾排序使用乙個序列h1,h2,h3,ht,叫做增量排序。在使用增量hk的一趟排序之後,對於每個i我們有a[i]時間複雜度:o(n^(1+a)),其中0
//3. 堆排序**不太好理解,使用了3層迴圈
void shellsort(elementtype a,int
n) a[j]=tmp;}}
}
思想:建立小頂堆,然後執行n次deletemin操作。
時間複雜度:o(nlogn),實踐中,慢於sedgewick的希爾排序
空間複雜度:o(n),用於建立堆得陣列
4.歸併排序
使用遞迴把陣列分為兩部分分別排序,然後合併成乙個陣列
時間複雜度:o(nlogn)
空間複雜度:o(n)
**void merge(elementtype a,elementtype tmparray, int lpos, int rpos, int rightend)
分成兩個不相交的集合:分別是s1(小於v),和大於v的部分s2
④返回quicksort(s1),繼隨v,繼而quicksort(s2)
時間複雜度:o(nlogn)
程式設計思想:1.選取樞紐元,取首尾及中間的三個元素,排序,小的排在首位,大的排在尾部,中的作為樞紐元
2.排序時把樞紐元放在right-1的位置上,i=left+1;j=right-2;開始交換過程
**elementtype median3(elementtype a,int left, int right)
qsort(elementtype a,int left,int right)
swap(&a[i],&a[right-1]);
qsort(a,left,i-1);
qsort(a,i+1,right);
}else
insertsort(a,right-left+1);
}6.直接選擇排序
描述:選出陣列中最小的元素,與陣列的第乙個元素交換;然後選擇出陣列中次小的元素,與與第二個元素交換,直到完成
選擇排序需要比較n(n-1)/2次,即n2次,而交換則只需要n-1次
對於是否已經排好序,或者隨機檔案,所花費的時間是一致的,即執行時間具有強迫性
選擇排序應用在資料項比較大,鍵比較小的情況下,因為此時移動元素花費時間較多,而對於其他排序演算法,元素移動頻繁的多
**void sort(elementtype a, int n)
,排序後a = 。
希爾排序:a = ,排序後(k = 2);a = 。
堆排序:a = ,排序後a = 。
直接選擇排序: a = ,排序後 a = 。
以上舉例都不滿足穩定性。
常用排序演算法的時間複雜度和空間複雜度
總結 1 當排序記錄個數n較大,關鍵碼分布較隨機,且對穩定性不作要求時,採用快速排序為宜。2 當待排序記錄個數n較大,記憶體空間允許,且要求穩定排序時,採用歸併排序。3 當待排序記錄個數n較大,關鍵碼分布可能出現正序或逆序的情況,且對穩定性不作要求時,採用堆排序或歸併排序。4 當待排序記錄個數n較大...
常用的排序演算法的時間複雜度和空間複雜度
常用的排序演算法的時間複雜度和空間複雜度 排序法 最差時間分析 平均時間複雜度 穩定度 空間複雜度 氣泡排序 o n2 o n2 穩定 o 1 快速排序 o n2 o n log2n 不穩定 o log2n o n 選擇排序 o n2 o n2 穩定 o 1 二叉樹排序 o n2 o n log2n...
常用的排序演算法的時間複雜度和空間複雜度
常用的排序演算法的時間複雜度和空間複雜度 排序法最差時間分析 平均時間複雜度 穩定度空間複雜度 氣泡排序 o n2 o n2 穩定o 1 快速排序 o n2 o n log2n 不穩定o log2n o n 選擇排序 o n2 o n2 穩定o 1 二叉樹排序 o n2 o n log2n 不一頂o...