C語言實現快速排序

2022-10-10 13:45:12 字數 3734 閱讀 9797

我覺得氣泡排序是比較簡單的;

所以今天我們實現乙個叫做快速排序的;

problem

你想要將(4,3,5,1,2)排序成(1,2,3,4,5)

你決定使用最簡單的快速排序;

solution

首先,開啟你的terminal,我寫得c**通常都是用vi編輯,gcc編譯;

vim quicksortsample.c
因為,快速排序需要對資料進行分割然後處理,再分割再處理;

顯然需要乙個遞迴的過程;

所以,我們先把遞迴結束條件寫好;

#include void quick_sort( int *a, int

n)

也就是說,當輸入只有乙個數字就沒有必要排序啦!直接返回;

void quick_sort( int *a, int

n)

}

注意: p = a[n / 2];的目地是獲取陣列中得中間位置的資料;

我們都知道,陣列下標是整數,因此,如果n=3那麼n/2應該是1,此時正好平分陣列;

若是,n=4那麼n/2應該是2,而此時它們就不完全是平分陣列啦;

for迴圈的作用是為了從前後兩個方向分別遍歷;

void quick_sort( int *a, int

n)

}

注意:我們在for迴圈中又進行啦while迴圈;

它的作用是對元素進行遍歷,假設左邊的資料沒有p中儲存的元素大,那麼繼續尋找,並且把i自增;

當找到比p大的或者相等得則停止第乙個while迴圈;

例如:如果陣列(2,5,3,1,4)那麼p顯然是3,當while迴圈發現5大於3時停止迴圈,此時i=1;

同理,第二個while迴圈中,p依然是3,當while迴圈第一次發現4大於3則繼續迴圈此時j=4;

當while迴圈到j=3時,得到的元素是1,1不大於3所以停止迴圈,此時得到的j=3;

好啦!那麼我們知道在for迴圈中沒有明確指定迴圈停止條件;

它該什麼時候停止呢?

void quick_sort( int *a, int

n)

}

注意:當i>=j意味著此時資料已經全部遍歷完了;

因為i與j分布在陣列左右兩部分,當它們重合,當然也就表明它們遍歷完啦;

剛才,我們的兩個while迴圈分別找到啦乙個左邊比p大得元素,和乙個右邊比p小的數字;

顯然這兩個元素應該交換位置的;

那麼怎麼實現呢;

void quick_sort( int *a, int

n)

}

我們看到了,在氣泡排序中也用到得交換語句;

此時我們完全遍歷了一遍陣列;

我們在main函式中測試一下;

#include void quick_sort( int *a, int

n)

}int main(void);

int n = sizeof a /sizeof a[0

];

inti;

for (i = 0; i < n; i++)

printf(

"%d%s

", a[i], i == n -1 ? "

\n" : "");

quick_sort(a, n);

for (i = 0; i < n; i++)

printf(

"%d%s

", a[i], i == n -1 ? "

\n" : "");

return0;

}

main函式的語句都非常容易懂,就不解釋啦;

看看編譯執行的結果:

顯然,執行的結果是我們預期的;

3左邊的都比3小啦!那若果資料多一些呢;

比如我們會發現左邊有兩個元素都比3大,理論上要進行兩次交換;

顯然當它交換完[1]與[5]元素後,它又是怎麼繼續的我們關心這個問題;

顯然交換完資料後,又進入for迴圈;

for迴圈沒有結束條件,因此,i++,j--完成後,此時i=2,j=4;

接下來執行兩個while發現,第乙個while發現a[2]是7 不小於p此時不執行i++;

同樣在第二個while中也發現a[4]是-1不大於p此時不執行j--;

然後到if語句不成立,因此繼續進行資料交換;

測試如下資料;

#include void quick_sort( int *a, intn)}

int main(void);

int n = sizeof a /sizeof a[0

];

inti;

for (i = 0; i < n; i++)

printf(

"%d%s

", a[i], i == n -1 ? "

\n" : "");

quick_sort(a, n);

for (i = 0; i < n; i++)

printf(

"%d%s

", a[i], i == n -1 ? "

\n" : "");

return0;

}

我們會得到如下結果:

顯然,我們已經得到啦p左邊都是小於p的;

右邊則是大於p的;

符合我們的設想;

為了把整個陣列正確排序,我們需要分別又對兩部分重複一遍剛才的操作;

好,我們遞迴的呼叫函式,並且把陣列的兩部分元素傳遞到函式中;

void quick_sort( int *a, int

n)

quick_sort( a, i);

quick_sort( a + i, n -i);

}

注意:第乙個遞迴呼叫處理陣列的前部分,a對應的是陣列的首位址,i是指對應的元素個數;

第二個遞迴呼叫處理陣列後部分,a + i指的當然是首位址加偏移位址,如果你對偏移位址有問題的話,應該看看計算機定址方式的資料啦;

接下來看執行結果:

最後,我們把所有**附上:

#include void quick_sort( int *a, int

n)

quick_sort( a, i);

quick_sort( a + i, n -i);

}int main(void);

int n = sizeof a /sizeof a[0

];

inti;

for (i = 0; i < n; i++)

printf(

"%d%s

", a[i], i == n -1 ? "

\n" : "");

quick_sort(a, n);

for (i = 0; i < n; i++)

printf(

"%d%s

", a[i], i == n -1 ? "

\n" : "");

return0;

}

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