- 1.基础信息
- 2.应用场景
- 2.1 一维数组
- 2.1.1 int型数组
- 2.1.2 char型数组
- 2.1.3 double型数组
- 2.1.3 字符串数组
- 2.2 二维数组
- 2.2.1 非malloc分配的数组
- 2.2.2 malloc分配的数组
- 2.3 结构体排序
- 2.3.1 仅按照身高排序
- 2.3.2 按照身高排序,身高相同的按照体重排序,体重相同的按照编号排序(三级排序)
更新中
1.基础信息
1.1 所在头文件 #include
1.2 函数原型
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
参数说明:
base: 需要排序的数组的地址
nitems:数组中的元素数量
size:每一个元素的大小,以字节为单位
comper:用来比较两个元素的函数
1.3 返回值:不返回任何值
针对int型,char型,double型,char*型数组。参考 https://blog.csdn.net/zhao888789/article/details/79186619
2.1.1 int型数组int cmpInt(const void*a, const void*b)
{
int *aa = (int *)a;
int *bb = (int *)b;
return *aa - *bb; // 升序
// return *bb - *aa; // 降序
}
2.1.2 char型数组
int cmpChar(const void*a, const void*b)
{
char *aa = (char*)a;
char *bb = (char*)b;
return *aa - *bb; // 升序
}
2.1.3 double型数组
int cmpDouble(const void*a, const void*b)
{
double *aa = (double*)a;
double *bb = (double*)b;
return *aa > *bb ? 1 : -1; // 注意
}
2.1.3 字符串数组
int cmpStr(const void*a, const void*b)
{
char *aa = (char*)a;
char *bb = (char*)b;
return strcmp(a, b);
}
2.2 二维数组
2.2.1 非malloc分配的数组
// 按照数组某一列排序
int g_col = 0;
int cmpCol(comst void*a, const void*b)
{
return ((int*)a)[g_col] - ((int*)b)[g_col];
}
2.2.2 malloc分配的数组
参考 https://blog.csdn.net/sinat_35119798/article/details/78547194
// 只参考第一列排序
int cmpCol(comst void*a, const void*b)
{
int *aa = *(int**)a;
int *bb = *(int**)b;
return aa[0] - bb[0]; // 只按照第一列排序
}
// 第一列相等,按照第二列排序
{
int *aa = *(int**)a;
int *bb = *(int**)b;
if (aa[0] == bb[0]) {
return aa[1] - bb[1];
} else {
return aa[0] - bb[0];
}
}
2.3 结构体排序
首先定义一个结构体
typedef struct {
int id; // 编号
int height; // 身高
int weight; // 体重
} Massage;
2.3.1 仅按照身高排序
int cmp_Height(const void*a, const void* b)
{
Massage *aa = (Massage *)a;
Massage *bb = (Massage*)b;
return aa->height - bb->height;
}
2.3.2 按照身高排序,身高相同的按照体重排序,体重相同的按照编号排序(三级排序)
int msgCmp(const void*a, const void*b)
{
Massage *aa = (Massage*)a;
Massage *bb = (Massage*)b;
if (aa->height != bb->height) {
return aa->height - bb->height;
} else if (aa->height == bb->height && aa->weight != bb->weight) {
return aa->weight - bb->weight;
} else if (aa->height == bb->height && aa->weight == bb->weight) {
return aa->id - bb->id;
}
}



