本篇目的:介绍C语言中快速排序函数的用法。
qsort:quick sort,快速排序。
其出世之日,电闪雷鸣,震惊了世界,其他排序算法的速度不能望其项背。
一、项目驱动
对于一个整数数组,请分别对其中数据进行升序和降序排列。
二、函数原型
•#include <stdlib.h> //头文件
•void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );
•buf:待排序数据的首地址
•num:待排序数据个数
•size:每个数据的大小,单位是字节
•compare:比较函数。
•可以通过重新定义compare比较函数,来调整是升序还是降序。
int (*compare)(const void *, const void *) 这是函数的原型,即你必须按照这种个数来自己定义该函数。
三、比较函数的写法
int Asending(const void *x,const void *y)
{//升序比较函数
int *a,*b;
a=(int*)x;
b=(int*)y;
if(*a>*b)
return 1;
else if(*a==*b)
return 0;
else
return -1;
}
int Desending(const void *x,const void *y)
{//升序比较函数
int *a, *b;
a=(int*)x;
b=(int*)y;
if(*a>*b)
return -1;
else if(*a==*b)
return 0;
else
return 1;
}
注意:比较函数的名字无所谓,但是其参数和返回值类型是系统规定好的。你必须符合规则。
四、主函数
void printArray1D(int a[],int n)
{//打印数组中数据
int i;
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
int a[]={1,4,6,2,5,3};//数组
int n=sizeof(a)/sizeof(int);//数据个数
//升序排列
qsort(a,n,sizeof(int),Asending);
printArray1D(a,n) ;
//降序排列
qsort(a,n,sizeof(int),Desending);
printArray1D(a,n) ;
return 0;
}
注意:主调函数在调用qsort时,把比较函数当作参数传递给qsort,其内部机制为:
x会指向a[i],y会指向a[j]
若compare(x,y)返回值为1,则交换a[i]和a[j]的值,否则不交换。
所以你调整比较函数的返回值是 1 还是 -1,就能调整是升序还是降序。