• 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程序设计语言》第五章,第三段。)
  • 相关阅读:
    Pyhton 单行、多行注释方法
    laravel中不使用 remember_token时退出报错,如何解决?
    PHP实现打印出库单,有没有实现过?
    是不等号的意思
    PHP如何输出合并单元格的表
    一起谈.NET技术,.Net创建Excel文件(插入数据、修改格式、生成图表)的方法 狼人:
    一起谈.NET技术,ASP.NET MVC 通过 FileResult 向浏览器发送文件 狼人:
    一起谈.NET技术,asp.net Ajax AutoComplete控件使用 狼人:
    一起谈.NET技术,Silverlight 拖动复制控件 狼人:
    一起谈.NET技术,ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline[上篇] 狼人:
  • 原文地址:https://www.cnblogs.com/fzd19zx/p/2311467.html
Copyright © 2020-2023  润新知