快速排序是一种非常高效的排序算法,原理为:对于一组给定的数据,取一个基准值,把小于基准值的数放到前部分,大于基准值的放到后部分,其中前部分的所有数都不大于后部分任意一个数,然后再依次对前后两部分的数进行快排,递归该过程,直到序列中的所有数均为有序为止。
以数组{4,6,3,1,2,7,8,9,5}为例:
第一步:以4为基准值,[2,1,3] 4 [6,7,8,9,5]
第二步:分别以2,6为基准值,[1] 2 [3] 4 [5] 6 [7,8,9]
第三步:以7为基准值,1,2,3,4,5,6,7,[8,9]
第四步:以8为基准值,1,2,3,4,5,6,7,8,9
平均时间复杂度为O(nlogn),平均空间复杂度O(logn)
//快速排序
#include<stdio.h>
void Sort(int a[], int low, int high)
{
if (low >= high)
return;
int i = low;
int j = high;
//取a[i]为基准关键字
int index = a[i];
//把小于index的数分到前面,大于Index的数分到后面
while (i < j)
{
while (i<j && a[j] > index)
--j;
if (i < j)
a[i++] = a[j];
while (i < j && a[i] < index)
++i;
if (i < j)
a[j--] = a[i];
}
a[i] = index;
//继续进行排序,直到每一组的个数为1时
Sort(a, low, i - 1);
Sort(a, i + 1, high);
}
//进行快速排序
void QuickSort(int a[], int len)
{
Sort(a, 0, len - 1);
}
int main()
{
int array[] = { 1,4,7,9,2,3,5,8 };
int len = sizeof(array) / sizeof(array[0]);
QuickSort(array,len);
for (int i = 0;i < len;++i)
printf("%d ", array[i]);
printf("\n");
return 0;
}