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;
}