基本介绍
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序采用双向查找的策略,每一趟选择当前所有子序列中的一个关键字作为枢纽轴(temp),将子序列中比枢纽轴小的前移,比枢纽轴大的后移,当本趟所有子序列都被枢轴按上述规则划分完毕后将会得到新的一组更短的子序列,他们将成为下趟划分的初始序列集。
时间复杂度:最好情况(待排序列接近无序)时间复杂度为O(nlog2n),最坏情况(待排序列接近有序)时间复杂度为O(n2),平均时间复杂度为O(nlog2n)。
基本函数模板
void quicksort(int a[],int left,int right)//left为首地址,right为末地址
{
int i,j,temp;//设置temp为基准,使各元素与它比较
i=left;
j=right;
temp=a[left];
if(left>right)
return;
while(i!=j)/*找到最终位置*/
{
while(a[j]>=temp && j>i)
j--;
if(j>i)//i后移
a[i++]=a[j];
while(a[i]<=temp && j>i)
i++;
if(j>i)//j前移
a[j--]=a[i];
}
a[i]=temp;
quicksort(a,left,i-1);/*递归左边*/
quicksort(a,i+1,right);/*递归右边*/
}
每一趟函数以temp为中心,将比temp小的放到左侧,大的放到右侧,而后两侧分别继续找新的temp,划分为两部分,递归求解。
C语言库函数qsort的使用
头文件:stdlib.h
用 法: void qsort(void *base, int n, int width, int cmp);
注:void *base:待排序数组首地址
int n:数组元素个数
int width: 各元素占用空间大小,例如sizeof(int),sizeof(double)
int (*fcmp)(const void *,const void *) :比较函数,令人头秃
适用范围:数组,字符串,结构体均可
普通数组
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int s[10000],n,i;
int cmp(const void a, const void b)
{
return((int )a-(int )b);/这里的(int)a定义了一个指向int型的指针,注意int 两边的括号不能少,然后(int )a前面加上就表示取其指向的值。这里返回的是(int )a-(int)b,两个数相减的顺序跟函数形参顺序一样这样就会将数组按升序排序,反之如果是return((int )b-(int*)a),就会将数组按降序排列*/
}
voidmain()
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i<n;i++)
printf("%d\n",s[i]);
}
double型数组
两个double类型数不可能相等,故将cmp函数中替换为
return(((double)a-(double)b>0)?1:-1);
注意这里不能像上面对int型数组排序时那样直接返回*(double*)a-(double)b,因为这个cmp函数的返回值已经规定了是int型,而*(double*)a-(double)b是double型
所以用两数作差,为正返回正,为负返回负。
这篇博文上写得很清楚详细,点他—>快排函数qsort调用