快速排序的基本思想如下:
在一組無序元素中,找到乙個數作為基準數。
將大於它的數全部移動到它的右側,小於它的全部移動到右側。
在分成的兩個區中,再次重複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...
資料結構與演算法 快速排序
基礎概念 快速排序,聽這個名字就能想到它排序速度比較快方法,是一種分治思想。所謂分治,就是指以乙個數為基準,將序列中的其他數往它兩邊 扔 以從小到大排序為例,比它小的都 扔 到它的左邊,比它大的都 扔 到它的右邊,然後左右兩邊再分別重複這個操作,不停地分,直至分到每乙個分割槽的基準數的左邊或者右邊都...