前言:quicksort是冒泡法的改进版,由于quicksort的排序效率在同为0(N*logN)的几种排序方法中效率最高,当面对大量的数据时,使用quicksort能比冒泡法大大节省时间。
quicksort采用了一种分治的策略,通常称为分治法(Divide-and- ConquerMethod),
基本思想:1.先从数列中取出一个数作为基准数(一般选择第一个数)。
2.分区过程:将比这个基准数大的数放在他的右边,小于或者等于基准书的数则放在它的左边,
3.再对左右区间重复第二步的动作,直到各个区间只有一个数。
特殊情形分析:
定义数据 a[8], low = 0; hight = 7; key = a[low];
情况一:基准数之后的数据都比它大,如:10,12,15,13,14,16,11,17.则无需排序。
while(low < hight && a[hight] > key)
hight--;
情况一:基准数之后的数据都比它小,如:20,12,15,13,14,16,11,17.
第一次,20,12,15,13,14,16,11,17. 将最后一个数据位填到第一位,
a[ low] = a[hight];
while(low < hight && a[low] > key)
hight--;
实现代码如下:
#include <stdio.h>
#include <stdlib.h>
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
}
int
main()
{
int a[] = {3,7,1,5,9,2,6,4,8,0};
char i;
quick_sort(a,0,9);
for( i = 0; i <= 9;i++){
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}