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程序设计语言》第五章,第三段。)

你可能感兴趣的:(sort)