程式設計基礎之快速排序 C語言實現

2021-09-03 02:10:58 字數 1636 閱讀 2669

下標:0     1     2     3     4     5     6     7     8     9

數值:72   6     57    88  60   42    83   73   48    85

初始化:i=0;j=9;x=a[i];(x=72)

i 代表陣列左邊(初值為最左邊),j 代表陣列右邊(初值為最右邊)

第一步:

將a[0]的數值賦值給x,相當於找了乙個臨時變數,這時a[0]的值可以隨意改變,因為由x儲存。即a[0]為乙個「坑」,按照排序的原則,我們應該把比它小的數(或者等於它的數)放到它左邊。

第二步:

從j開始(從右邊開始往左邊【j--】)找比x(臨時值)【從坑里拿出來的值】小或者等於它的數。當j=8,符合條件,這時直接將符合條件的值,填入坑中,即a[0]=a[8]。這個由i值標識的坑已經被填入了符合條件的值,所以i向右移動,即i++;。然後形成了乙個新的坑a[8],再找數字來填a[8]這個坑。注意x的值不變!

第三步:

j已經用過了,開始用i,即從左邊開始往右邊【i++】尋找比x大的值,當i=3,符合條件,將a[3]挖出再填到上乙個坑a[8]中。即a[8]=a[3];j--;這個由j值標識的坑已經被填入了符合條件的值,所以j向左移動,即j--;。

第四步:

重複上面兩步,直到i和j相遇。

生成新陣列:

0    1    2    3    4    5    6    7    8    9

48   6    57   42   60   ?    83  73   88   85

然後發現相遇的地方值不準確。

所以最後把之前最先挖出來用於做比較的臨時變數x,填進去。

即a[i]=x;或者a[j]=x;

即陣列為:

0    1    2    3    4    5    6    7    8    9

48   6    57   42   60   72    83  73   88   85

這之後a[5]【臨時變數】前面的數字都小於它,後面的數字都大於它。但是這些數字不是有序的,因此再對a[0...4]和a[6...9]進行排序即可。

#include #include #define n 16

int partition(int arr,int left,int right)

{ int key = arr[left];

while(left=key)right--;

if(left白話經典演算法六——快速排序

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...