C語言之--快速排序
純屬學習記錄,僅供參考。
快速排序
快速排序:
(1)首先規定一個“基准”, 將數據分為兩個部分。
(2)將大於等於(大於)的數據放在基准的右面,將小於(小於等於)的數據放在基准的左面。
(3)然后,左面的數據又可以規定一個基准,分為兩部分;右面的數據也可以規定一個基准,也分為兩部分。遞歸下去。
(4)直到分到不可再分,或數據有序。
如果右面找到一個小於基准的數,左面找到一個小於基准的數,而且左右沒有相遇則交換左右數據。
如果左右相遇了,那么就把基准與相遇點數據交換。
自此,將序列分為左右兩部分。左面的小於基准,右面的大於基准。
代碼示例:
#include <stdio.h> #include <string.h> void QuickSort(char arry[], int L, int R); void main(void) { int i; char arry[8] = {5, 4, 9, 8, 7, 6, 2, 1}; printf("原來順序:\n"); for (i = 0; i < sizeof (arry); i++) { printf("%d\t", arry[i]); } printf("\n"); QuickSort(arry, 0, 7); printf("排序后:\n"); for (i = 0; i < sizeof (arry); i++) { printf("%d\t", arry[i]); } printf("\n"); return; } void QuickSort(char arry[], int L, int R) { int left = L,right = R; int x; int Centor = 0,temp = 0; if (L > R) { return; } Centor = arry[L];//基准保存在Centor中 while (left != right)//left 與 right 沒有相遇 則繼續循環交換 { while (arry[right] >= Centor && left < right)//如果右面的數大於基准跳過,小於基准停止, { right--; } while (arry[left] <= Centor && left < right)//如果左面的數小於基准跳過,大於基准停止, { left++; } if (left < right)//如果left 與 right 沒有相遇,則將 右面小於基准的數 與 左面大於基准的數交換 { temp = arry[left]; arry[left] = arry[right]; arry[right] = temp; } //顯示交換后的序列 for (x = 0; x < 8; x++) { printf("%d\t", arry[x]); } printf("\n"); } //如果left 與 right 相遇 則將基准以相遇的位置數據互換,至此 就將數據分為了左右兩部分 //左面的小於基准,右面的大於基准 arry[L] = arry[left]; arry[left] = Centor; //將左面的繼續進行排序 QuickSort(arry, L, left-1); //將右面的繼續進行排序 QuickSort(arry, right+1, R); }
輸出結果:
原來順序: 5 4 9 8 7 6 2 1 5 4 1 8 7 6 2 9 5 4 1 2 7 6 8 9 5 4 1 2 7 6 8 9 2 1 4 5 7 6 8 9 2 1 4 5 7 6 8 9 1 2 4 5 7 6 8 9 1 2 4 5 6 7 8 9 排序后: 1 2 4 5 6 7 8 9