写在前面
在 cplusplus.com 里有关于qsort
函数的详细解释,
void qsort(void* base, size_t num, size_t size, int (*compar)(const void*, const void*));
是它的函数原型. 它的功能: 对指向的数组的元素进行快速排序, 此函数使用的排序算法通过调用指定的函数来比较元素对,
并将指向它们的指针作为参数. 这里就是利用了回调函数, 详见 C 语言指针详解(2)
参数的意义:
base
: 指向要排序的数组的第一个对象的指针, 类型 void*
num
: 指向数组中的元素数, 类型无符号整型 size_t
size
: 数组中每个元素的大小, 单位(字节), 类型无符号整型 size_t
compar
: 指向比较两个元素的函数的指针, 这个函数遵循原型:int compar (const void* p1, const void* p2);
qsort
可以对任意类型的数据进行排序, 它将比较函数抽离出来, 谁调用qsort
, 谁就提供compar
函数.
一般比较函数如下所示: compar
int compareMyType (const void * a, const void * b) { if ( *(MyType*)a < *(MyType*)b ) return -1; if ( *(MyType*)a == *(MyType*)b ) return 0; if ( *(MyType*)a > *(MyType*)b ) return 1; }
|
但是请注意, 不是所有的类型的数据都可以用>``<``=
来比较大小.
实现(冒泡排序)
int cmp_int(const void* x, const void* y) { return (*(int*)x - *(int*)y); } void swap_int(void* x, void* y) { int tmp = *(int*)x; *(int*)x = *(int*)y; *(int*)y = tmp; } void swap(void* x, void* y, int size) { for (int i = 0; i < size; i++) { char tmp = *((char*)x+i); *((char*)x + i) = *((char*)y + i); *((char*)y + i) = tmp; } } void my_qsort(void* base, size_t num, size_t size, int (*cmp)(const void* p1, const void* p2)) { for (unsigned int i = 0; i < num - 1; i++) { int is_order = 1; for (unsigned int j = 0; j < num - 1 - i; j++) {
if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) < 0) { is_order = 0; swap((char*)base + j * size, (char*)base + (j + 1) * size, size); } } if (is_order == 1) { break; } } } int main() { int arr[10] = { 5,1,7,3,9,4,8,2,10,6 }; int size = sizeof arr / sizeof arr[0]; my_qsort(arr, size, sizeof(arr[0]), cmp_int); printf("after my_qsort:\n"); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } return 0; }
|
写在最后