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