qsort(…)的使用方法

在 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()定义是很值得分析的:

  1. 参数 const void * i 要分成两部分来看,
    首先,是 void * i ,这表示一个指针i,指针的类型是 void * 这是什么类型的指针呢?
    “ANSI C的一个最重要的变化是,它明确地制订了操纵指针的规则。事实上,这些规则已经被很多优秀的程序设计人员和编译器所采纳。此外,ANSI C使用类型 void * (指向void的指针)代替 char * 作为通用指针的类型。”(《C程序设计语言》第五章,第三段。)
原文地址:https://www.cnblogs.com/fzd19zx/p/2311467.html