經典演算法 快速排序

2022-03-30 22:36:02 字數 2144 閱讀 8686

題目說明:快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序n 個專案要ο(n log n)次比較。在最壞狀況下則需要ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他ο(n log n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來。

題目解析:快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

演算法步驟:

1、從數列中挑出乙個元素,稱為 「基準」(pivot),

2、重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

3、遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

偽**:

quick_sort(a,p,r)

if(p

then q

quick_sort(a,p,q-1

) quick_sort(a,q+1

,r)

//核心函式,對陣列a[p,r]進行就地重排,將小於a[r]的數移到陣列前半部分,將大於a[r]的數移到陣列後半部分。

partition(a,p,r)

pivot

i for j

doif a[j]

i exchange a[i]

a[j]

exchange a[i+1]a[r]

return i+1

程式**:

#include #include 

using

namespace

std;

template

int partition(t* data, int low, int

high)

}tmp = data[i+1

]; data[i+1] =data[high];

data[high] =tmp;

return i+1;}

template

void qsort(t* data, int low, int

high)}//

helper function

templatevoid showelem(t&val)

template

bool validate(t* data, int low, int

high)

}return

true;}

test(algo, tqsort)

; qsort(d1,

0, 7

); for_each(d1, d1+8, showelem);

assert_true(validate(d1,

0,7));

cout

<

int d2 = ;

qsort(d2,

0, 0

); for_each(d2, d2+1, showelem);

assert_true(validate(d2,

0,0));

cout

<

int d3 = ;

qsort(d3,

0, 18

); for_each(d3, d3+19, showelem);

assert_true(validate(d3,

0,18

)); cout

<

}

執行結果:

看書、學習、寫**

《經典排序演算法 快速排序》

快速排序是實踐中已知的最快的排序演算法,平均執行時間o nlogn 該演算法之所以快是因為非常精煉和高度優化的內部迴圈。它也是一種分治的遞迴演算法,將陣列s排序的基本演算法由下列簡單的四步組成 如果s中元素個數是0或1,則返回。取s中任一元素v,稱之為樞紐元。將s 分成兩個不相交的集合s1 x v ...

經典排序演算法 快速排序

使用分割槽演算法並找出主元 對主元兩邊的序列分別進行排序 整體時間複雜度 o nlog n public class quicksort 分割槽演算法 public static intpartition int a,int l,int r else if a l a mid a l a r els...

經典快速排序演算法與隨機快速排序演算法

快速排序用到了分治思想,同樣的還有歸併排序。乍看起來快速排序和歸併排序非常相似,都是將問題變小,先排序子串,最後合併。不同的是快速排序在劃分子問題的時候經過多一步處理,將劃分的兩組資料劃分為一大一小,這樣在最後合併的時候就不必像歸併排序那樣再進行比較。但也正因為如此,劃分的不定性使得快速排序的時間複...