C語言實現陣列快速排序演算法

2021-06-28 19:55:41 字數 2163 閱讀 1259

c語言實現陣列快速排序演算法

快速排序演算法,顧名思義,是迄今為止發現的速度最快的排序演算法。快速排序演算法採用分治的思想,首先在要排序的序列中選取乙個基準數(一般選取序列的第乙個,其實選取哪個是無關緊要的),將序列分成兩部分,其中基準數的左邊全是小於基準數的數,基準數右邊是大於或者等於基準數的數。這樣,基準數的位置在序列中的位置就固定了,然後將基準數兩邊的序列進行相同的處理,直到最後乙個序列只有乙個數字,這樣演算法就完成了。**如下:

序列,第一次選取基準數5進行一次劃分,劃分後的序列為:,5左邊的序列進行相同的劃分,選取這個序列的基準數為3,劃分後的結果為,此時3的左邊已沒有序列,而3右邊的序列為,因為這時序列中只有乙個數字,顯然這樣的序列是已經排好序的;然後處理第一次基準數5右邊的序列,選取基準數為6,進行劃分後序列為,6左邊已經沒有序列,6右邊的序列為,對這個序列選取基準數為8,進行劃分得,8左邊和序列為,右邊的序列為,此時,排序已經完成。動態圖如下:

可見,快速排序的核心演算法就是劃分演算法,在我們上面的討論中,這種劃分演算法是由glenn w. rowe提出的,還有一種更早的劃分演算法是由c. a. r. hoare提出的。這裡只討論和實現glenn w. rowe提出的劃分演算法。快速排序演算法的執行過程如下:

開始——劃分序列——得到劃分序列的子串行——再次劃分——得到劃分序列的子串行……。

首先討論glenn w. rowe劃分演算法:

假如glenn w. rowe劃分演算法選取陣列第0位作為基準數,那麼glenn w. rowe劃分演算法從陣列第1位掃瞄到陣列最後一位,遇到比基準數大的,就交換到右邊,比基準數小的,交換到左邊,其演算法時間複雜度為o(n)

實現**如下:

//採用glenn w. rowe劃分演算法

int partition_rowe(int arr, int low, int high)}}

//low_index的位置就是pivot應處在的位置,low_index指向的總是比pivot小的數

arr[low] = arr[low_index];

arr[low_index] = pivot;

return low_index;

}

以序列為例,一次劃分過程如下:

1.low_index首先指向基準數,迴圈從陣列第1位開始:

2.如果在遍歷部分的元素中發現比基準數更小的數,則自增low_index,判斷遍歷的下標i與low_index是否相等,若不相等,則交換i和low_index指向的元素,若相等,則說明low_index指向的元素比基準數要小。在上面的序列中,i指向的8,7,6都要比基準數大,low_index不會發生自增行為,直到i指向4進,4要比基準數5小,low_index自增,此時low_index指向8,i和low_index並不相等,於是交換兩個元素的位置,如此類推,3和7的位置交換。迴圈結束,low_index指向的元素為3,交換3和5的元素位置,一次劃分完成。

最後為:

此時,基準數左邊的數全是小於基準數的,右邊的數全是大於或者等於基準數的。快速排序的思想是將基準數左邊與右邊分成2個序列,重複此過程,直到最後每個序列只有乙個元素,則陣列就已經排好序了。

快速排序的實現**如下:

void quick_sort(int arr, int low, int high)

}

用於交換陣列兩個元素的函式宣告如下:

void swap(int arr, int index_i, int index_j)

測試**如下:

int main()

;for (int i = 0; i < 7; i++)

printf("\n");

quick_sort(arr, 0, 6);

for (int i = 0; i < 7; i++)

return 0;

}

輸出結果為:

快速排序演算法 C語言實現

快速排序演算法 c語言實現 注 本篇內容為翻譯,之所以選擇這篇進行翻譯原因是該文章含有動畫,能夠更加直觀地展示快速排序。同時,可以仔細看一下 中把結構化的思想給予了更加充分地表現。按照功能進行模組劃分的思想得到了徹底地貫徹。以下內容翻譯自 譯文 在快速排序演算法中,使用了分治策略。首先把序列分成兩個...

快速排序演算法 C語言實現

注 本篇內容為翻譯,之所以選擇這篇進行翻譯原因是該文章含有動畫,能夠更加直觀地展示快速排序。同時,可以仔細看一下 中把結構化的思想給予了更加充分地表現。按照功能進行模組劃分的思想得到了徹底地貫徹。以下內容翻譯自 譯文 在快速排序演算法中,使用了分治策略。首先把序列分成兩個子串行,遞迴地對子序列進行排...

快速排序演算法(C語言實現)

自實現部分可參看慕課網陳越老師資料結構課程。庫函式函式原型 void qsort void buf,size t num,size t size,int compare const void const void 函式說明 對buf指向對資料 包含num項,每項的大小為size 進行快速排序。voi...