1、程序文件
#include <stdio.h>
// 快速排序(Quicksort)是对冒泡排序的一种改进
// 通过一趟排序将要排序的数据分割成独立的两部分,
// 其中一部分的所有数据都比另外一部分的所有数据都要小,
// 然后再按此方法对这两部分数据分别进行快速排序,
// 整个排序过程可以递归进行,以此达到整个数据变成有序序列。
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
// 算基准值下标
int partion(int *a, int left, int right)
{
int pivot = a[right]; // 以最后一个元素作为基准值
while(left < right)
{
// 本次循环结束后,a[left]的值比基准值大
while (a[left] <= pivot && left < right)
{
left++;
}
if (left < right)
{
// 把以left为下标的比基准值更大的元素移到右边
a[right] = a[left];
right--;
}
// 因为之前已经对a[left]进行了判断,所以left < right
while (a[right] >= pivot && left < right)
{
right--;
}
if (left < right)
{
// 把以right为下标的比基准值更小的元素移到左边
a[left] = a[right];
left++;
}
}
// 因为之前的right处的值已被a[left]覆盖
// 而right处的值被保存在pivot中
a[left] = pivot;
// left是基准值下标
return left;
}
void quickSort(int *a, int left, int right)
{
if (left < right)
{
// 第一次得基准值下标0
int pivotIndex = partion(a, left, right); // 算基准值下标
quickSort(a, left, pivotIndex-1); // 对左半部分做快速排序
quickSort(a, pivotIndex+1, right); // 对右半部分做快速排序
}
}
int main()
{
int a[] = {5,8,6,0,9,4,3,2,1,7};
int len = sizeof(a)/sizeof(a[0]);
quickSort(a, 0, len-1);
myPrint(a, len);
return 0;
}
2、测试结果
root@lj:/mnt/hgfs/shared-lj# gcc 快速排序study.c
root@lj:/mnt/hgfs/shared-lj# ./a.out
0 1 2 3 4 5 6 7 8 9