C语言中不像C++一样有sort(arr.begin(),arr.end(),cmp)排序接口,但是也提供类似的库函数。
1. 首先要包含头文件<stdlib.h>
2. 对于一维整型数组
函数指针定义:
int cmp_int(const void *a, const void *b) {
int *_a = (int *)a;
int *_b = (int *)b;
return *_a - *_b;
}
main函数调用:
int main()
{
int num[10] = {1, 6, 3, 9, 1, 6, 5, 2};
qsort(num, 10, sizeof(int), cmp_int);
for (int i = 0; i < 10; ++i)
printf("%d ", num[i]);
printf("\n");
return 0;
}
3. 对于二维整型数组
函数指针定义(对于非malloc
申请的多维数组):
int cmp_intTwo(const void *a, const void *b) {
if (((int *)a)[0] != ((int *)b)[0])
return ((int *)a)[0] - ((int *)b)[0];
else return ((int *)a)[1] - ((int *)b)[1];
}
函数指针定义(对于malloc
申请的多维数组):
int cmp_intTwoExtend(const void *a, const void *b)
{
int *_a = *(int **)a;
int *_b = *(int **)b;
if (_a[0] != _b[0]) return _a[0] - _b[0];
else return _a[1] - _b[1];
}
main函数调用(对于非malloc
申请的多维数组):
int main()
{
int arr[5][2] = {{2, 1}, {1, 2}, {2, 2}, {1, 1}, {1, 3}};
qsort(arr, 5, sizeof(arr[0]), cmp_intTwo);
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 2; ++j)
printf("%d ", arr[i][j]);
printf("\n");
}
return 0;
}
main函数调用(对于malloc
申请的多维数组):
int main()
{
int row = 3;
int **arr1 = (int **) malloc(sizeof(int *) * row);
for (int i = 0; i < 3; ++i) {
arr1[i] = (int *) malloc(sizeof(int) * 2);
}
arr1[0][0] = 1, arr1[0][1] = 2;
arr1[1][0] = 1, arr1[1][1] = 1;
arr1[2][0] = 0, arr1[2][1] = 2;
qsort(arr1, 3, sizeof(arr1[0]), cmp_intTwoExtend);
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j)
printf("%d ", arr1[i][j]);
printf("\n");
}
for (int i = 0; i < 3; ++i)
free(arr1[i]);
free(arr1);
return 0;
}
4. 对于字符型数组
函数指针定义:
int cmp_char(const void *a, const void *b) {
char *_a = (char *)a;
char *_b = (char *)b;
return *_a - *_b;
}
main函数调用:
int main()
{
char ch[20] = {"iufdffsalkdj"};
qsort(ch, strlen(ch), sizeof(char), cmp_char);
printf("%s ", ch);
return 0;
}
5. 对于字符串型数组
函数指针定义:
int cmp_string(const void *a, const void *b) {
char *_a = *(char **)a;
char *_b = *(char **)b;
return strcmp(_a, _b);
}
main函数调用:
int main()
{
char *str[10] = {"nidwufuh", "qdiuw", "xbdnwi", "aKDWHOW", "DUIQDQR"};
qsort(str, 5, sizeof(char *), cmp_string);
for (int i = 0; i < 7; ++i)
printf("%s ", str[i]);
return 0;
}