快速排序
快速排序是一種在含n個數的輸入陣列上最壞情況執行時間為o(n2)的演算法,平均效能的期望執行時間為o(nlgn),且o(nlgn)記號中隱含的常數因子很小。另外,它還能夠進行原地置換排序。
快速排序是基於分治模式上的,分治過程三個步驟:
1.分解:把陣列a[p...r]分成兩個非空子陣列a[p...q]和a[q+1...r],使得a[p...q]的每個元素都小於等於a[q+1...r]中的元素,下標q也在這個劃分過程中進行計算。
2.解決:通過遞迴呼叫快速排序對子陣列a[p...q]和a[q+1...r]排序。
3.合併:因為兩個子陣列是原地排序的,不需要將它們合併,整個陣列a[p...r]已排序。
過程如下:
quicksort(a,p,r)
if pthen q = partition(a,p,r);
quicksort(a,p,q);
quicksort(a,q+1,r);
快速排序演算法的關鍵是partition過程,它對子陣列a[p...r]進行劃分,並得到劃分的界限q:
partition(a,p,r)
x = a[p];
i = p-1;
j = r+1;
while true
do repeat j = j-1
until a[j] <= x
repeat i = i+1
until a[i] >= x
if ithen swap (a[i] , a [j])
else return j
**如下:
void
swap(
int&
a, int&b)
...
intpartition(
int*
a, int
left,
intright)
...}
void
quicksort(
int*
a,int
left,
intright)
...}
void
printarray(
intdata,
intn)
...printf(""
);}
void
main()
...;
quicksort(a,0,
6);
printarray(a,7);
}
當陣列已經排序好(正序)時,快速排序的的時間代價是o(n2),而這對插入排序只要o(n)的時間
因為此時把陣列劃分為兩部分,分別含1個和n-1個的陣列,而快速排序的最佳情況是兩個子陣列大小都是n/2
改進(隨機化版本):當陣列還沒有被劃分時,可將元素a[p]與a[p...r]中隨機選出的乙個元素交換。
只要把partition函式開頭加入隨機化即可:
randomized_partition(a,p,r)
i = random(p,r)
swap (a[p],a[i])
return partition(a,p,r)
相應地,在quicksort裡呼叫randomized_partition(a,p,r)
**如下:
void
swap(
int&
a, int&b)
...
intpartition(
int*
a, int
left,
intright)
...}
int
new_random(
intmin,
intmax)
...
intrandomized_partition(
int*
a, int
left,
intright)
...
void
randomized_quicksort(
int*
a,int
left,
intright)
...}
void
printarray(
intdata,
intn)
...printf(""
);}
void
main()
...;
randomized_quicksort(a,0,
6);
printarray(a,7);
}
另外,還有乙個方案,是在待排序的陣列裡隨機選三個元素,取值為第二大的那個作為基準數也可
排序演算法總結(快速排序)
終於不用改 了,希望文章大修順利!穩定的演算法 不穩定的演算法 內部排序 排序過程不涉及內 外存交換 外部排序 排序過程有內 外存交換 in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基...
排序演算法總結 快速排序
快速排序的一般步驟如下 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。來自於 啊哈!演算法 這裡需要解釋一下為什麼每次交換的時候都需要右邊的哨兵先走 最主要是相遇點的問題,演算法的...
排序演算法總結 快速排序
前面說的氣泡排序是一種交換排序。交換排序還有一種演算法,就是快速排序演算法。快速排序的核心思想是分而治之。意思就是選出乙個基準 可以是第乙個元素,也可以是最後乙個。為了方便我們選取第乙個 將小於這個基準的全部元素都放在這個基準的左邊,大於這個基準的全部元素都放在基準的右邊。然後分別對左右兩個陣列在進...