C/C++中有一个快速排序的标准库函数 qsort ,在stdlib.h 中声明,其原型为:

void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *));

  使用该函数,可以对任何类型的一维数组排序。该函数参数中,base 是待排序数组的起始地址,nelem 是待排序数组的元素个数,width 是待排序数组的每个元素的大小(以字节为单位),最后一个参数 pfCompare 是一个函数指针,它指向一个“比较函数”。

修改排序数组排序起始基地址和带排序元素个数可以实现数组部分排序。

qsort 函数的用法规定,“比较函数”的原型应是:int 函数名(const void * elem1, const void * elem2);该函数的两个参数,elem1 和elem2,指向待比较的两个元素。也就是说, * elem1 和* elem2 就是待比较的两个元素。该函数必须具有以下行为:

  1) 如果 * elem1 应该排在 * elem2 前面,则函数返回值是负整数(任何负整数都行)。

  2) 如果 * elem1 和* elem2 哪个排在前面都行,那么函数返回0

  3) 如果 * elem1 应该排在 * elem2 后面,则函数返回值是正整数(任何正整数都行)。

例如:

 #include <iostream>
#include <stdio.h>
#include <stdlib.h> using namespace std; int compare(const void *a, const void *b)
{
int *pa = (int*)a;
int *pb = (int*)b;
return (*pa )- (*pb); //从小到大排序
} void main()
{
int a[] = {, , , , , ,, , , };
qsort(a, , sizeof(int), compare);
for (int i = ; i < ; i++)
cout << a[i] << " " << endl;
}

如果要从大到小排列,只需要将比较函数中return (*pa )- (*pb); 改为return (*pb )- (*pa); 即可。

再如:

下面的程序,功能是调用qsort 库函数,将一个unsigned int 数组按照个位数从小到大进行排序。比如 8,23,15 三个数,按个位数从小到大排序,就应该是 23,15,8:

 #include <stdio.h>
#include <stdlib.h>
int MyCompare( const void * elem1, const void * elem2
{
  unsigned int * p1, * p2;
  p1 = (unsigned int *) elem1; //语句6
  p2 = (unsigned int *) elem2; //语句7
  return (* p1 % ) - (* p2 % ); //语句8
}
#define NUM 5
int main()
{
  unsigned int an[NUM] = { ,,,, };
  qsort( an, NUM, sizeof(unsigned int), MyCompare);
  for( int i = ;i < NUM; i ++ )
    printf("%d ", an[i]);
  return ;
}

上面程序的输出结果是:
10 11 123 4 8

qsort 函数执行期间,需要比较两个元素哪个应在前面时,就以两个元素的地址作为参数,调用 MyCompare 函数。如果返回值小于0,则qsort 就得知第一个元素应该在前,如果返回值大于0,则第一个元素应该在后。如果返回值等于0,则哪个在前都行。
对语句6 解释如下:由于elem1 是 const void * 类型的,是void 指针,那么表达式“*elem1”是没有意义的。elem1 应指向待比较的元素,即一个unsigned int 类型的变量,所以要经过强制类型转换,将elem1 里存放的地址赋值给 p1,这样,* p1 就是待比较的第
一个元素了。语句7 同理。语句8 体现了排序的规则。如果 *p1 的个位数小于 *p2 的个位数,那么就返回负值。其他两种情况不再赘述。

最新文章

  1. Python学习基本
  2. 连连看[HDU1175]
  3. jquery控制文字内容溢出用点点点(…)省略号表示
  4. Visual Studio VS2010统计代码行数(转载)
  5. gulp学习
  6. 2014 牡丹江现场赛 A.Average Score(zoj 3819) 解题报告
  7. html打印表格每页都有的表头和打印分页
  8. 手机端viewport的设置规范
  9. ASP.NET中重复表格列合并的实现方法(转自脚本之家)
  10. Activemq集群搭建
  11. 随机切换IP和UA
  12. python函数4种类型及函数生成帮助文档
  13. [TJOI2014]拼图
  14. Golang的select多路复用以及channel使用实践
  15. Android SDK版本号 与 API Level 对应关系
  16. YARN 启动后失败退出——没有请求资源——Invalid resource request, no resources request
  17. *C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)
  18. python——简单爬虫
  19. 入手IntelliJ IDEA 常用配置
  20. 解决 只能通过chrome网上应用商店安装该程序

热门文章

  1. 文件操作-dd
  2. 小型LAMP搭建
  3. centos7.2安装redis与配置(史上最全)
  4. 设计模式之建造者模式——Builder
  5. lfyzoj104 Counting Swaps
  6. [工具使用] visualvm 通过jmx不能连接
  7. Linux基础命令详解-2
  8. ActionProxy相关实现类
  9. JSON.parse与eval区别
  10. 安卓ImageView.src设置图片拉伸、填满控件的方法