在 stdlib.h 中,有一个 qsort(…) 函数,用于对给定的元素进行快速排序。
她的声明是:
void qsort(
void *base, /*待排序的数组*/
size_t n, /*数组中元素的个数*/
size_t size, /*数组中每个元素所占的内存字节数*/
int (*cmp) (const void *,const void * ) /*对任意两个元素进行比较的函数*/
)
具体说来,qsort(…)对base[0]…base[n-1]数组中的对象,进行升序排序,数组中每个对象的长度位size。其中,cmp是一个用于排序比较的函数。cmp的描述如下:如果第一个参数(查找关键字)小于第二个参数(表项),则必须返回一个负值;如果第一个参数等于第二个参数,则必须返回0;如果第一个参数大于第二个参数,则必须返回一个正数。
显而易见,通过稍稍调整cmp比较的方式,就可以实现在qsort中的逆序排序。
具体的排序代码,请见:这里
我们先来看一个简单的例子,它说明了如何对一个一维数组中的元素进行排序。
代码分析如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 /*利用qsort(),对一个整数数组进行升序排序 输入:源代码内置整数数组; 输出:排序后的整数数组*/ # include "stdio.h" # include "stdlib.h" # define NUM (6) /*这是qsort(...)会用到的比较函数*/ int cmp(const void * i, const void * j) { int x,y; /*根据 (const void *) 获取真正需要比较的数值*/ x=*(int *)i; y=*(int *)j; if (x>y) return 1; else if (x<y) return -1; else return 0; } /*展示data[]的内容*/ void showData(int data[]) { int i; for (i=0; i<=NUM-1; i=i+1) { printf("%d, ",data[i]); } printf("\n"); return; } int main() { int data[NUM] = {5,2,3,1,7,6}; freopen("data.out.txt","w",stdout); printf("%d\n",sizeof(int)); showData(data); qsort( data, /*待排序的一维数组的起始地址*/ NUM, /*待排序的元素的个数*/ sizeof(int), /*每个元素所占的内存字节数*/ cmp /*对任意两个元素进行比较的函数*/ ); showData(data); return 0; }
第11行的cmp()定义是很值得分析的:
- 参数 const void * i 要分成两部分来看,
首先,是 void * i ,这表示一个指针i,指针的类型是 void * 这是什么类型的指针呢?
“ANSI C的一个最重要的变化是,它明确地制订了操纵指针的规则。事实上,这些规则已经被很多优秀的程序设计人员和编译器所采纳。此外,ANSI C使用类型 void * (指向void的指针)代替 char * 作为通用指针的类型。”(《C程序设计语言》第五章,第三段。)