一趟排序:取區間內第乙個元素作為基準,將該元素放在適當的位置,此時基準數左邊的數都比它小,基準數右邊的數都比大。接下來便用同樣的方法分別對左右兩邊的資料進行排序,直到序列中沒有元素或只有乙個元素。
int
partition
(int a,
int low,
int high)
a[low]
= temp;
return low;
}void
quicksort
(int a,
int low,
int high)
}
最優:o(n
logn)
o(n\log n)
o(nlogn)
平均:o(n
logn)
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−
1n−
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
(logn
)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
logn)
o(n\log n)
o(nlogn)
平均:o(n
logn)
o(n\log n)
o(nlogn)
最差:o(n
logn)
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 次比較,但這種狀況並不常見。事實上,快...