演算法與資料結構 七 快速排序

2021-09-16 22:22:13 字數 1570 閱讀 3565

快速排序的基本思想如下:

在一組無序元素中,找到乙個數作為基準數。

將大於它的數全部移動到它的右側,小於它的全部移動到右側。

在分成的兩個區中,再次重複1到2 的步驟,直到所有的數全部有序

下面還是來看乙個例子

[3,6,1,2,8,4,7]

首先選取乙個基準數,一般選擇序列最左側的數為基準數,也就是3,將小於3的數移動到3的左邊,大於3的移動到3的右邊,得到如下的序列

[2,1,3,6,8,4,7]

接著針對左側的[2, 1] 這個序列和 [6, 8, ,4, 7]這兩個序列再次執行這種操作,直到所有的數都變為有序為止。

知道了具體的思路下面就是寫演算法了。

void

qsort

(int a,

int n)

}

這裡定義了乙個函式作為快速排序的函式,函式需要傳入序列的首位址以及序列中間元素的長度。在排序函式中只需要關注如何進行調整即可。

這裡進行了乙個判斷,當調整函式返回-1時表示不需要調整,也就是說此時已經都是有序的了,這個時候就不需要調整了。

程式的基本框架已經完成了,剩下的就是如何編寫調整函式了。調整的演算法如下:

首先定義兩個指標,指向最右側和最左側,最左側指標指向基準數所在位置

先從右往左掃瞄,當發現右側數小於基準值時,將基準值位置的數替換為該數,並且立刻從左往右掃瞄,直到找到乙個數大於基準值,再次進行替換

接著再次從右往左掃瞄,直到找到小於基準數的值;並再次改變掃瞄順序,直到調整完畢

最後直到兩個指標重合,此時重合的位置就是基準值所在位置

根據這個思路,可以編寫如下**

int

quicksort

(int a,

int nlow,

int nhigh)

int tmp = a[nlow]

;int i = nlow;

int j = nhigh;

while

(i != j)

if(a[j]

< tmp)

//接著從左往右掃瞄,直到找到比基準值大的數

//將該數放入到基準值的右側

while

(a[i]

< tmp && i < j)

if(a[i]

> tmp)}

a[i]

= tmp;

return i;

}

到此已經完成了快速排序的演算法編寫了。

在有大量的資料需要進行排序時快速排序的效果比較好,如果資料量小,或者排序的序列已經是乙個逆序的有序序列,它退化成o(n^2)。

快速排序是乙個不穩定的排序演算法。

演算法與資料結構 七 快速排序

快速排序的基本思想如下 在一組無序元素中,找到乙個數作為基準數。將大於它的數全部移動到它的右側,小於它的全部移動到右側。在分成的兩個區中,再次重複1到2 的步驟,直到所有的數全部有序 下面還是來看乙個例子 3,6,1,2,8,4,7 首先選取乙個基準數,一般選擇序列最左側的數為基準數,也就是3,將小...

資料結構與演算法 排序演算法 快速排序

源 cpp view plain copy include void quicksort int int,int intfindposs int int,int intmain quicksort arry,0,6 printf after sorted n for i 0 i 7 i printf...

資料結構與演算法 快速排序

基礎概念 快速排序,聽這個名字就能想到它排序速度比較快方法,是一種分治思想。所謂分治,就是指以乙個數為基準,將序列中的其他數往它兩邊 扔 以從小到大排序為例,比它小的都 扔 到它的左邊,比它大的都 扔 到它的右邊,然後左右兩邊再分別重複這個操作,不停地分,直至分到每乙個分割槽的基準數的左邊或者右邊都...