函数原型:void qsort (void *base ,size_t num,size_t width,int(_cdecl * compare)(const void*,const void *));
头文件:stdlib.h
参数:void *base:待排序数组首地址
size_t num:数组中待排序元素的数量
size_t width:各元素占用空间大小
int(_cdecl * compare)(const void*,const void *):指向函数的指针,用于确定排序顺序
对快速排序的应用,主要是比较函数的编写
一、对int型数组排序
int cmp(const void *a,const void *b)//void类型的指针可以指向任意类型
{
return *(int *)a-*(int *)b; //强制类型转换指针a与指针b,将a和b指向qsort函数中的第三个参数类型
}
代码示例:
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int a[10];
for(int i=0;i<10;i++)
scanf("%d",&a[i]);
qsort(a,10,sizeof(a[0]),cmp);
for(int i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
二、对double型数组排序
(与int型排序类似)
int cmp(const void *a,const void *b)
{
return *(double *)a>*(double *)b?1:-1;
}
三、对char型数组的排序
int cmp(const void *a,const void *b)
{
return *(char*)a-*(char*)b;
}
代码示例:
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return *(char*)a-*(char*)b;
}
int main()
{
char a[10];
for(int i=0;i<10;i++)
scanf("%c",&a[i]);
qsort(a,10,sizeof(a[0]),cmp);
for(int i=0;i<10;i++)
printf("%c ",a[i]);
return 0;
}
四、对结构体一级排序
struct T{
int x;
int y;
}t[100];
int cmp(const void *a,const void *b)
{
return ((T *)a)->x-((T *)b)->x;
}
代码示例:
#include<stdio.h>
#include<stdlib.h>
struct T{
int x;
int y;
}t[100];
int cmp(const void *a,const void *b)
{
return ((T *)a)->x-((T *)b)->x;
}
int main()
{
for(int i=0;i<10;i++)
scanf("%d",&t[i].x);
qsort(t,10,sizeof(t[0]),cmp);
for(int i=0;i<10;i++)
printf("%d ",t[i]);
return 0;
}
五、对结构体二级排序
(若x不同,则按照x排序;若x相同时,按照y排序)
#include<stdio.h>
#include<stdlib.h>
struct T{
int x;
int y;
int z;
}t[100];
int cmp(const void *a,const void *b)
{
if(((T *)a)->x!=((T *)b)->x)
return ((T *)a)->x-((T *)b)->x;
else
return ((T *)a)->y-((T *)b)->y;
}
int main()
{
for(int i=0;i<10;i++)
scanf("%d",&t[i].x);
qsort(t,10,sizeof(t[0]),cmp);
for(int i=0;i<10;i++)
printf("%d ",t[i]);
return 0;
}
六、对结构体中的字符串排序
(相当于二维字符数组)
struct T
{
char str[10];
}s[100];
int cmp(const void *a,const void *b)
{
return strcmp(((T *)a)->str,((T *)b)->str);
}
代码示例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct T
{
char str[10];
}s[100];
int cmp(const void *a,const void *b)
{
return strcmp(((T *)a)->str,((T *)b)->str);
}
int main()
{
for(int i=0;i<10;i++)
scanf("%s",&s[i].str);
qsort(s,10,sizeof(s[0]),cmp);
for(int i=0;i<10;i++)
printf("%s ",s[i].str);
return 0;
}
七、对二维字符数组排序
char s[2001][1001];
int cmp(const void *a, const void *b){
return strcmp((char *)a,(char *)b);
}
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s[2001][1001];
int cmp(const void *a, const void *b){
return strcmp((char *)a,(char *)b);
}
int main(){
int i,n;
scanf("%d",&n);
getchar();//避免换行符被字符串接收
for(i=0;i<n;i++)
gets(s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i<n;i++)
puts(s[i]);
return 0;
}