qsort()
qosrt()这个函数很有作用,可以用来排列一维的数组,还可以排列二维的数组等高纬度的数组。除此之外,还可以排列一部分的数组元素,qsort第一个参数是数组名,第二个参数是数组的长度,第三个参数是数组成员的大小,第四个参数是比较器。
一维数组
整形的一维数组
先来一份小代码
int cmp(const void *a, const void * b)
{
int c = *(int *)a;
int d = *(int *)b;
return c - d;
}
int main()
{
int i;
int a[5] = {1,3,2,4,0};
qsort(a,5, sizeof(int), cmp);
for (i = 0; i < 5; i++)
printf("%d ",a[i]);
}
结果
0 1 2 3 4
首先我们要理解cmp的含义,cmp是一个比较器,当我们cmp返回的是一个正数时,会进行交换,例如如果上述的代码中变量c是3 d是2,c - d是大于0的,所以a[1]与a[2]进行交换。
灵活的运用
我们可以通过过改变起始位置和数组的长度来改变排列的范围
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int cmp(const void *a, const void * b)
{
int c = *(int *)a;
int d = *(int *)b;
return c - d;
}
int main()
{
int i;
int a[5] = {1,3,2,4,0};
qsort(a+1,3, sizeof(int), cmp);
//我们从a[1]开始,到a[4]结束,重点是不包括a[4]
for (i = 0; i < 5; i++)
printf("%d ",a[i]);
}
结果
1 2 3 4 0
一维的字符数组
对于排列一维的字符数组也是一样的。因为字符的运算本质是阿斯卡码的运算。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int cmp(const void *a, const void * b)
{
char c = *(char *)a;
char d = *(char *)b;
return c - d;
}
int main()
{
int i;
char a[5] = {'a','v','q','b','c'};
qsort(a,5, sizeof(char), cmp);
for (i = 0; i < 5; i++)
printf("%c ",a[i]);
}
二维数组
整形的二维数组
先来一份小代码
int cmp(const void *a, const void * b)
{
int* c = *(int **)a;
int* d = *(int **)b;
return c[0] - d[0];//如果是第二个元素排序就是c[1]与d[1]l了
}
int main()
{
int i, fi = 4;
int** a = malloc(sizeof(int **) * 2);
for(i = 0; i < 2; i++)
a[i] = malloc(sizeof(int) * 2);
for(i = 0; i < 2; i++)
{
a[i][0] = fi--;
a[i][1] = fi--;
}
qsort(a,2, sizeof(int*), cmp);
for (i = 0; i < 2; i++)
printf("%d %d\n",a[i][0],a[1][1]);
}
结果
2 3
4 3
请注意这个直接开一个二维数组是,在使用qsort()有问题的原因不知道,知道的大佬可以说一下。这里是通第一个元素从小到大的排序。
###字符的二维数组
来一份代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<string.h>
int cmp(const void *a, const void * b)
{
char* c = *(char **)a;
char* d = *(char **)b;
return strcmp(c,d);
}
int main()
{
int i;
char fi = 'z';
char** a = malloc(sizeof(char **) * 2);
for(i = 0; i < 2; i++)
a[i] = malloc(sizeof(char) * 2);
for(i = 0; i < 2; i++)
{
a[i][0] = fi--;
a[i][1] = fi--;
}
qsort(a,2, sizeof(char*), cmp);
for (i = 0; i < 2; i++)
printf("%c %c\n",a[i][0],a[1][1]);
}
注意cmp在这cmp中,使用的是strcmp(),看可以通过它,进行字典序的排序,从而达到对二位数组的排序,strcmp详细的用法可以百度一下。