快速排序 c語言實現10 1 1

2021-07-31 16:06:13 字數 1965 閱讀 8658

思想

快速排序採用的思想是分治思想。

快速排序是找出乙個元素(理論上可以隨便找乙個)作為基準(pivot),然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n-1個元素也調整到排序後的正確位置。最後每個元素都是在排序後的正 確位置,排序完成。所以快速排序演算法的核心演算法是分割槽操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞迴。

**如下

void sort(int *a, int left, int right)

int i = left;

int j = right;

int key = a[i];//挖i坑

while(i < j) /*用基準數劃分分割槽迴圈*/

a[i] = a[j];//填i坑,挖出j坑

/*找到乙個這樣的數後就把它賦給前面的被拿走的i的值(如果第一次迴圈且key是

a[left],那麼就是給key)*/

while(i < j && key >= a[i])

/*這是i在當組內向前尋找,同上,不過注意與key的大小關係停止迴圈和上面相反,

因為排序思想是把數往兩邊扔,所以左右兩邊的數大小與key的關係相反*/

a[j] = a[i];//填j坑,挖出i坑

}a[i] = key;/*基準數放到正確位置*/

sort(a, left, i - 1);/*最後用同樣的方式對分出來的左邊的小組進行同上的做法*/

sort(a, i + 1, right);/*用同樣的方式對分出來的右邊的小組進行同上的做法*/

/*當然最後可能會出現很多分左右,直到每一組的i = j 為止*/

}

時間複雜度分析

最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另乙個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減少乙個。時間複雜度為o(n*n)

在最好情況下,每次劃分所取的基準都是當前無序區的"中值"記錄,劃分的結果是基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數:o(nlgn)

儘管快速排序的最壞時間為o(n2),但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快者,快速排序亦因此而得名。它的平均時間複雜度為o(nlgn)。

因為快速排序要用到進棧和出棧,這個比較耗時間,所以可以更改**如下

void sort(int *a, int left, int right)

int i = left;

int j = right;

int key = a[i];//挖i坑

while(i < j) /*用基準數劃分分割槽迴圈*/

a[i] = a[j];//填i坑,挖出j坑

/*找到乙個這樣的數後就把它賦給前面的被拿走的i的值(如果第一次迴圈且key是

a[left],那麼就是給key)*/

while(i < j && key >= a[i])

/*這是i在當組內向前尋找,同上,不過注意與key的大小關係停止迴圈和上面相反,

因為排序思想是把數往兩邊扔,所以左右兩邊的數大小與key的關係相反*/

a[j] = a[i];//填j坑,挖出i坑

}a[i] = key;/*基準數放到正確位置*/

sort(a, left, i - 1);/*最後用同樣的方式對分出來的左邊的小組進行同上的做法*/

sort(a, i + 1, right);/*用同樣的方式對分出來的右邊的小組進行同上的做法*/

/*當然最後可能會出現很多分左右,直到每一組的i = j 為止*/

}

選擇基準值也可以進行優化,比如取中值!將中值和第乙個數進行交換就可以用上面方法了

C語言實現快速排序

快速排序,是氣泡排序的改進,通過尋找 中間元素 在一趟排序中,把比 中間元素 小的數放到左邊,比 中間元素 大的數放到右邊,如此遞迴,最終得到排序結果。include define num 5 void quick sort int a,int left,int right void swap in...

c語言實現快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽結束...

快速排序 C語言實現

以前使用rm時,ruby指令碼提供乙個sort函式,可以把陣列進行排序,後來得知採用的演算法是快速排序。隨著資料結構課程的學習,快速排序如今也不再神秘,如下 using namespace std void quicksort int a,int low,int high int first low...