排序演算法之快速排序 歸併排序,堆排序

2021-10-02 13:49:56 字數 2747 閱讀 4652

一趟排序:取區間內第乙個元素作為基準,將該元素放在適當的位置,此時基準數左邊的數都比它小,基準數右邊的數都比大。接下來便用同樣的方法分別對左右兩邊的資料進行排序,直到序列中沒有元素或只有乙個元素。

int

partition

(int a,

int low,

int high)

a[low]

= temp;

return low;

}void

quicksort

(int a,

int low,

int high)

}

最優:o(n

log⁡n)

o(n\log n)

o(nlogn)

平均:o(n

log⁡n)

o(n\log n)

o(nlogn)

最差:o(n

2)o(n^2)

o(n2)

最差情況分析:每次劃分只比上次劃分少乙個數,此時需要執行 n−1

n-1n−

1 次遞迴呼叫

比較次數:∑i=

1n−1

n−i=

n−1+

n−2+

n−3+

...+

1\sum_^n-i = n-1 + n-2 + n-3 + ... + 1

∑i=1n−

1​n−

i=n−

1+n−

2+n−

3+..

.+1

= (n

−1+1

)(n−

1)2=\frac

=2(n−1

+1)(

n−1)​=n

(n−1

)2=\frac

=2n(n−

1)​=o(

n2)=o(n^2)

=o(n2)

所以要麼待排序的陣列已經排好公升序或者排好反序,或者全部數字一樣,就會導致退化成;o(n

2)o(n^2)

o(n2

)的複雜度。最優:每一次都平分陣列o

(log⁡n

)o(\log n)

o(logn

)最差:退化成氣泡排序o(n

)o(n)

o(n)

void

merge

(vector<

int>

&arr,

int start,

int mid,

int end)

while

(i <= mid)

//假如左半邊還有剩餘沒排完

tmp.

push_back

(arr[i++])

;while

(j <= mid)

//假如右半邊還有剩餘沒排完

tmp.

push_back

(arr[j++])

;for

(int i =

0; i < tmp.

size()

; i++

)//賦值回去

arr[start + i]

= tmp[i];}

void

mergesort

(vector<

int>

&arr,

int start,

int end)

最優:o(n

log⁡n)

o(n\log n)

o(nlogn)

平均:o(n

log⁡n)

o(n\log n)

o(nlogn)

最差:o(n

log⁡n)

o(n\log n)

o(nlogn)

大頂堆:每個節點的值都大於或者等於它的左右子節點的值。

小頂堆:每個節點的值都小於或者等於它的左右子節點的值。

#include

using

namespace std;

int size;

void

maxheap

(int a,

int n)

else

// 如果有右節點,並且右節點的值更大,更新最大值的索引

if(rightchild <= size && a[rightchild-1]

> a[largest-1]

)if(largest != n)

}void

buildmaxheap

(int a,

int n)

cout<

void

heapsort

(int a,

int n)

}int

main()

; size =

sizeof

(a)/4;

int n = size;

heapsort

(a, size)

;for

(int i =

0; i < n; i++

) cout<

return0;

}

演算法之常見排序演算法 氣泡排序 歸併排序 快速排序

引言 對於程式設計中琳琅滿目的演算法,本人向來是不善此道也不精於此的,而說起排序演算法,也只是會氣泡排序。還記得當初剛做開發工作面試第一家公司時,面試官便讓手寫氣泡排序 入職之後才知道,這面試官就是乙個氣泡排序 病態 愛好者,逢面試必考氣泡排序 後來看吳軍的一些文章,提到提高效率的關鍵就是少做事情不...

JS演算法3 排序 歸併排序 快速排序

歸併排序 1.左右兩邊先排序 2.再借助輔助陣列,指標在左右兩個陣列中移動,兩指標作比較,小的就往輔助陣列中填 3.整體在輔助陣列中有序後,拷貝回原陣列。歸併排序 時間複雜度o n logn var list 5 2,6 1,22 77,4 12 console.log 未排序 list funct...

C 快速排序(快排) 歸併排序

二 歸併排序 快速排序 英語 quicksort 又稱分割槽交換排序 partition exchange sort 簡稱快排,一種排序演算法,最早由東尼 霍爾提出。在平均狀況下,排序n個專案要o n log n 大o符號 次比較。在最壞狀況下則需要 o n2 次比較,但這種狀況並不常見。事實上,快...