快速排序演算法的C語言實現
阿新 • • 發佈:2018-12-10
大一想進社團,院科協技術部,面試要自己用c寫個快排。以前從來沒有接觸過,對c的瞭解也僅限於高中和暑假出於興趣看的一點點資料,只能從基礎開始學。找了很多程式碼,有些本身自己就是錯的,還有些非常繞,根本看不懂。最後東拼西湊,總算是弄出來了個原型,再慢慢修改,終於弄得差不多了,發個部落格記錄一下。
首先,什麼是快速排序呢?這是一種排序方法,在氣泡排序的基礎上做了改進,在大多數情況下能夠比氣泡排序更有效率。(氣泡排序是快速排序的最壞情況,也就是說,只有在運氣最不好的情況下快速排序才會和氣泡排序花費同樣的時間),以下是快速排序的原理:
1. 尋找一個元素作為陣列的“基準”(pivot),通常我們選擇陣列的第一個,即最左邊的那一個。 2.從兩頭開始,重新將陣列進行排序,將比基準小的放在前邊,比基準大的放在後邊(也可以相反,這取決於你想從大到小排列還 是想從小到大排列。),這個過程被稱為分割槽(partition)操作。 3. 分別對基準左右兩邊的數字進行遞迴排列,重複多次,直到排序完成。 原始碼如下:
#include <stdio.h> #include <stdlib.h> int a [10] = {1, 8, 44, 77, 35, 65, 78, 12, 25, 45};//將陣列a設為全域性變數,也可以在主函式處設定。 int partition (int a[], int left, int right){ int key = a[left]; while (left < right){ while (left < right && a[right] >= key) right--;//從右邊開始尋找,直到找到第一個比基準值小的數,停止。 if (left < right)//此時比基準值小的數已經找到 a[left++] = a[right];//將比基準值小的數放在左邊 while (left < right && a[left] <= key) left++;//從左邊開始尋找,直到找到第一個比基準值大的數,停止。 if (left < right)//此時比基準值大的數已經找到 a[right--] = a[left];//將比基準值大的數放在右邊 }//此時left已經和right相遇,第一輪排序結束 a[left] = key;//將基準值放在中間 return left;//獲取第一輪排序結束後基準值的下標 } void quicksort (int a[], int begin, int end){ int x; if (begin < end){ x = partition(a, begin, end);//將x設定為上一輪排序結束後基準值的下標 quicksort (a, begin, x-1);//對左邊進行遞迴排序 quicksort (a, x+1, end);//對右邊進行遞迴排序 } return; } int main (void){ printf ("排序前:"); for (int s = 0; s <= 9; s++) printf("%d\t",a[s]); quicksort(a,0, 9); printf("\n排序後:"); for(int m=0;m<=9;m++) printf("%d\t",a[m]); system ("pause"); return 0; }
大學第一次自學記錄完畢。希望自己能進入想進的部門。