文章目录
头文件
<stdlib.h>
函数声明
void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
参数声明
base: 要排序的数组
nmemb: 数组中的元素数目
size: 每个数组元素占用内存空间,可使用sizeof获得
compar: 比较两个数组元素的比较函数。本比较函数的第一个参数值小于、等于、大于第二参数值时,本比较函数的返回值应分别小于、等于、大于零。
也就说你要实现一个这样的函数(升序):
int cmp(const void *a, const void *b)
如果a > b,返回>0
如果a == b, 返回0
如果a < b,返回<0
这里的a和b的关系仅仅是逻辑上的,并不是值比较,所以排序的可以不仅仅是数字,还可以是字符。
一些常用例子
1、对一维数组进行排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp ( const void *a , const void *b){
return *(int *)a - *(int *)b;
}
int main()
{
int array[20] = {0};
//生成一个随机一维数组
int i = 0;
for (i=0;i<20;i++){
array[i] = rand()%20;
}
for (i=0;i<20;i++){
printf("%d\n",array[i]);
}
qsort(array,20,sizeof(int),cmp);
printf("sort result:\n");
for (i=0;i<20;i++){
printf("%d\n",array[i]);
}
return 0;
}
2、对二维数组进行排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int comp(const void *a,const void *b){
return ((int *)a)[0]-((int *)b)[0];
}
int main()
{
int array[20][5] = {{0}};
//生成一个随机二维数组
int i = 0,j = 0;
for (i=0;i<20;i++){
for (j=0;j<5;j++){
array[i][j] = rand()%20;
}
}
for (i=0;i<20;i++){
for (j=0;j<5;j++){
printf("%-5d",array[i][j]);
}
printf("\n");
}
qsort(array,20,sizeof(int)*5,comp);
printf("sort result:\n");
for (i=0;i<20;i++){
for (j=0;j<5;j++){
printf("%-5d",array[i][j]);
}
printf("\n");
}
return 0;
}
3、对char类型数组进行排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp( const void *a , const void *b){
return *(char *)a - *(char *)b;
}
int main()
{
char word[30] = {0};
sprintf(word,"%s","happy");
printf("%s\n",word);
qsort(word,5,sizeof(char),cmp);
printf("%s\n",word);
return 0;
}
4、对double类型数组排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp( const void *a , const void *b){
return *(double *)a > *(double *)b ? 1 : -1;
}
int main()
{
int i = 0;
double num[20] = {0};
/*生成0-20的随机小数*/
for (i=0; i<20; i++){
num[i] = (double)(rand()%20) * (double)(rand()%20)/(double)20;
}
for (i=0; i<20; i++){
printf("%.2f\n",num[i]);
}
printf("sort result:\n");
qsort(num,20,sizeof(num[0]),cmp);
for (i=0; i<20; i++){
printf("%.2f\n",num[i]);
}
return 0;
}
5、对结构体一级排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct NUMBER{
int data;
char *other;
}num[20];
int cmp( const void *a , const void *b){
return (*(struct NUMBER *)a).data > (*(struct NUMBER *)b).data ? 1:-1;
}
int main()
{
int i = 0;
/*生成0-20的随机小数*/
for (i=0; i<10; i++){
num[i].data = rand()%10;
}
for (i=0; i<10; i++){
printf("%d\n",num[i].data);
}
printf("sort result:\n");
qsort(num,10,sizeof(num[0]),cmp);
for (i=0; i<10; i++){
printf("%d\n",num[i].data);
}
return 0;
}
6、对结构体二级排序
struct In{
int x;
int y;
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序
int cmp( const void *a , const void *b){
struct In *c = (In *)a;
struct In *d = (In *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
7、对字符串进行排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct NUMBER{
char str[100];
char *other;
}num[5];
int cmp( const void *a , const void *b){
return strcmp((*(struct NUMBER*)a).str,(*(struct NUMBER*)b).str);
}
int main()
{
int i = 0;
/*生成20个字符串*/
strcpy(num[0].str,"aaa");
strcpy(num[1].str,"bbb");
strcpy(num[2].str,"ccc");
strcpy(num[3].str,"aaa");
strcpy(num[4].str,"ccc");
for (i=0; i<5; i++){
printf("%s\n",num[i].str);
}
printf("sort result:\n");
qsort(num,5,sizeof(num[0]),cmp);
for (i=0; i<5; i++){
printf("%s\n",num[i].str);
}
return 0;
}
学无止境966
发布了174 篇原创文章 · 获赞 6 · 访问量 7525
私信
关注