qsort 原型
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
base:指向要排序的数组的第一个对象的指针,该对象转换为void*
num:数组的元素个数
size:数组中每个元素的大小
compar:指向比较两个元素的功能函数
qsort 使用
其实就是描述比较两个元素的功能函数的过程
// 比较整形元素
int cmp1(const void* x, const void* y) {
return (*(int*)x) - (*(int*)y);
}
// 比较字符型元素
int cmp2(const void* x, const void* y) {
return (*(char*)x) - (*(char*)y);
}
// 比较字符串
int cmp3(const void* x, const void* y) {
return strcmp(*(char**)x, *(char**)y);
}
// 比较浮点型元素
int cmp4(const void* x, const void* y) {
return (*(double*)x) - (*(double*)y);
}
测试:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
size_t i = 0;
int arr1[] = {9, 5, 2, 7};
qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), cmp1);
for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); ++i) {
printf("%d ", arr1[i]);
}
printf("\n");
char arr2[] = {'s', 'o', 'c', 'k'};
qsort(arr2, sizeof(arr2) / sizeof(arr2[0]), sizeof(arr2[0]), cmp2);
for(i = 0; i < sizeof(arr2) / sizeof(arr2[0]); ++i) {
printf("%c ", arr2[i]);
}
printf("\n");
const char* arr3[] = {"sock", "mark", "mike", "zero"};
qsort(arr3, sizeof(arr3) / sizeof(*arr3), sizeof(*arr3), cmp3);
for (i = 0; i < sizeof(arr3) / sizeof(*arr3); ++i) {
printf("%s ", arr3[i]);
}
printf("\n");
double arr4[] = {3.14, 6.18, 1.11, 9.99};
qsort(arr4, sizeof(arr4) / sizeof(arr4[0]), sizeof(arr4[0]), cmp4);
for (i = 0; i < sizeof(arr4) / sizeof(arr4[0]); ++i) {
printf("%lf ", arr4[i]);
}
printf("\n");
return 0;
}
效果:
qsort 延伸 --> 模仿 qsort 写一个冒泡排序
// 按字节来比较两个元素
int cmp(const void* x, const void* y) {
return (*(char*)x) - (*(char*)y);
}
// 将元素按字节交换
void Swap(char* buf1, char* buf2, size_t size) {
size_t i = 0;
for (i = 0; i < size; ++i) {
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
++buf1;
++buf2;
}
}
// 模仿 qsort 写一个冒泡排序
void bubble_sort(void* base, size_t num, size_t size, int(*compar)(const void*, const void*)) {
size_t i = 0;
size_t j = 0;
for (i = 0; i < num - 1; ++i) {
for (j = 0; j < num - i - 1; ++j) {
int ret = compar((char*)base + j * size, (char*)base + (j + 1) * size);
// 按升序来进行排列
if (ret > 0) {
Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
}
}
}
}
测试:
#include <stdio.h>
int main() {
size_t i = 0;
int arr1[] = {9, 5, 2, 7};
bubble_sort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), cmp);
for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); ++i) {
printf("%d ", arr1[i]);
}
printf("\n");
char arr2[] = {'s', 'o', 'c', 'k'};
bubble_sort(arr2, sizeof(arr2) / sizeof(arr2[0]), sizeof(arr2[0]), cmp);
for (i = 0; i < sizeof(arr2) / sizeof(arr2[0]); ++i) {
printf("%c ", arr2[i]);
}
printf("\n");
return 0;
}
效果: