各種排序演算法比較

2022-09-03 19:42:11 字數 2400 閱讀 8970

排序相關的演算法複雜度分析

下邊分別實現下各個演算法

簡單選擇排序

1

//簡單選擇排序

2void select_sort(int a, intn)3

16}17swap(a[i], a[index]);18}

19 }

這裡簡單選擇排序之所以不穩定是因為交換的時候會打亂順序,例如 5,4,5,1,6。第一次交換後會是1,4,5,5,6.已經破壞了穩定性。

演算法複雜度很明顯是o(n^2);

氣泡排序

1

//氣泡排序

2void bubble_sort(int a, intn)3

14}1516

if(flag == 0) return;17

}18 }

氣泡排序中有兩點需要注意的。第一它與簡單選擇排序相比其最好的時間複雜度是o(n)。第二 它是穩定性的演算法,因為它每次只交換相鄰的元素。

只交換相鄰的元素這個特點也讓它可以使用於鍊錶這個資料結構。

插入排序:

1

//插入排序

2void insertion_sort(int a, intn)3

12 a[j+1] =tmp;13}

14 }

插入排序最好的情形也是o(n)。

希爾排序就不實現了,這個排序的時間複雜度與具體的間隔選取之間有關。

堆排序(偽**):

1

//堆排

2int main(void)3

;5 vector heap(a, a + sizeof(a)/sizeof(int

));6

build(heap);

7 vectors;

8int maxindex =heap.size();

9for(int i = 0; i < maxindex; i++)

1022

if((2 * index + 2)

2327

swap(heap[min_index], heap[index]);

28if(index ==min_index)

29break;30

else

31 index =min_index;32}

3334}35

36return0;

37}3839

void build(vector &heap)

4054

if((2 * index + 2)

5559

swap(heap[min_index], heap[index]);

60if(index ==min_index)

61break;62

else

63 index =min_index;64}

65}66return ;

堆排序是基於選擇排序的思想上提出的。這裡利用實現更快的尋找最大最小值。其複雜度為o(nlgn)。它與簡單選擇排序相比編碼較繁瑣。

快速排序

1

void quick_sort(int a, int begin, int

end)218

swap(a[first],a[slot]);

1920 quick_sort(a, begin, first-1

);21 quick_sort(a, first+1

, end);

22 }

快排比較排序中平均速度最快的一種,但是如果選擇的主元不合適,會退化為n^2的複雜度。

歸併排序

1

void divide_conquer_sort(int a, int begin, int

end)218

else

1923}24

25while(first_begin <=mid)

26 store.push_back(a[first_begin++]);

27while(second_begin <=end)

28 store.push_back(a[second_begin++]);

29for(int i = 0; i < store.size(); i++)

30 a[i+begin] =store[i];

31 }

歸併排序相對於快排沒有選擇主元的問題,相應的也就沒有最壞時間那麼一說。其實還有一種使用空間是o(1)的歸併排序,實現起來要稍微複雜點。

各種排序演算法比較

花了很長時間終於把排序的基礎學了一下,這段時間學了很多東西,總結一下 學的排序演算法有 插入排序,合併排序,氣泡排序,選擇排序,希爾排序,堆排序,快速排序,計數排序,基數排序,桶排序 沒有實現 比較一下學習後的心得。我不是很清楚他們的時間複雜度,也真的不知道他們到底誰快誰慢,因為書上的推導我確實只是...

各種排序演算法的比較

穩定的排序演算法有 直接插入,冒泡,歸併,基數排序。一.快速排序 快排的三個步驟 1.選取樞紐元,一般用三數中值法,即求得left,center,right的中位數 不要用第乙個數,如果原始資料是倒序,效率將會很低 2.根據樞紐元把輸入資料劃分成為兩部分,左半部分的數比樞紐元小,右半部分比樞紐元大。...

各種排序演算法的比較

排序問題的解決方案是演算法問題當中最多的,常見的有插入排序,選擇排序,氣泡排序,歸併排序,快速排序,堆排序等,下面將對不同的排序演算法進行分析。假設均為實現從小到大排序,計算空間複雜度時,不考慮原本儲存元素的空間,只考慮實現演算法需要的額外空間。插入排序的基本思想是 從待排序的元素中選出乙個,插入已...