使用VC库函数中的快速排序函数
来源:互联网 发布:数据库log是什么文件 编辑:程序博客网 时间:2024/05/22 09:42
上一篇讲了快速排序的实现。但在很多场合,直接使用快速排序的库函数是很方便的。下面讲下VC中库函数qsort()的用法:
函数原型:
void qsort(void *base,size_t num,size_t width, int (__cdecl *compare )(const void *, const void *) );
第一个是数组地址,第二是数组大小,第三个是数组中每个元素的字节数,最后一个是个函数指针,表示如何比较数组中的元素。
头文件 #include <stdlib.h>
下面分别就int等整数数据,double等浮点数据,结构体和类,按指定方式这四种情况进行讲解。
实例1 对int等整数数据进行排序
- int cmp(constvoid *x, constvoid *y)
- {
- return *(int*)x - *(int*)y;
- }
- qsort(a, MAXN, sizeof(a[0]), cmp);
int cmp(const void *x, const void *y){return *(int*)x - *(int*)y;}qsort(a, MAXN, sizeof(a[0]), cmp);
MAXN为数组大小,下同
实例2 对double等浮点数进行排序
- int cmpDouble(constvoid *x, constvoid *y)
- {
- return (*(double*)x > *(double*)y ? 1 : -1);
- }
- qsort(a, n, sizeof(a[0]), cmpDouble);
int cmpDouble(const void *x, const void *y){return (*(double*)x > *(double*)y ? 1 : -1);}qsort(a, n, sizeof(a[0]), cmpDouble);
实例3 对结构体,类等复杂数据进行排序
如
- struct Student
- {
- char szName[30];
- int nAge;
- };
struct Student{char szName[30];int nAge;};
先对年龄排序,年龄相同再按姓名排序。
- int cmpStudent (constvoid *x, constvoid *y)
- { //先作下指针转换,再按要求比较
- Student *pNodex = (Student*)x, *pNodey = (Student*)y;
- if (pNodex->nAge != pNodey->nAge)
- return pNodex->nAge - pNodey->nAge;
- else
- return strcmp(pNodex->szName, pNodey->szName);
- }
- qsort(a, n, sizeof(a[0]), cmpStudent);
int cmpStudent (const void *x, const void *y){ //先作下指针转换,再按要求比较Student *pNodex = (Student*)x, *pNodey = (Student*)y;if (pNodex->nAge != pNodey->nAge)return pNodex->nAge - pNodey->nAge;elsereturn strcmp(pNodex->szName, pNodey->szName);}qsort(a, n, sizeof(a[0]), cmpStudent);
实例4 按指定方式进行排序。
如对只有大小写字母的字符串"AajkuKdYUBCDwyz"进行排序,要求大写字母在前,小写字母在后。
- int cmp1(constvoid *x, constvoid *y)
- {
- char *pcx = (char*)x, *pcy = (char*)y;
- bool flag1 = *pcx >='A' && *pcx <= 'Z';
- bool flag2 = *pcy >= 'A' && *pcy <= 'Z';
- if(flag1 == flag2) //如果都为大写字母或都为小写字母
- return *pcx - *pcy;
- else //否则,谁为大写字母,谁的权值小。
- return flag1 ? -1 : 1;
- }
- int main()
- {
- char szText[] ="AajkuKdYUBCDwyz";
- qsort(szText, strlen(szText), sizeof(szText[0]), cmp1);
- printf("%s\n", szText);
- return 0;
- }
int cmp1(const void *x, const void *y){char *pcx = (char*)x, *pcy = (char*)y;bool flag1 = *pcx >= 'A' && *pcx <= 'Z';bool flag2 = *pcy >= 'A' && *pcy <= 'Z';if(flag1 == flag2) //如果都为大写字母或都为小写字母return *pcx - *pcy;else //否则,谁为大写字母,谁的权值小。return flag1 ? -1 : 1;}int main(){char szText[] = "AajkuKdYUBCDwyz";qsort(szText, strlen(szText), sizeof(szText[0]), cmp1);printf("%s\n", szText);return 0;}
- 使用VC库函数中的快速排序函数
- 使用VC库函数中的快速排序函数
- 使用VC库函数中的快速排序函数
- 使用VC库函数中的快速排序函数
- 使用VC库函数中的快速排序函数
- 使用VC库函数中的快速排序函数
- 使用VC库函数中的快速排序函数
- 使用VC库函数中的快速排序函数
- 使用VC库函数中的快速排序函数
- [编程珠玑读书笔记]最好的快速排序与库函数中的排序函数比较
- 快速排序库函数qsort的使用
- c语言库函数 qsort(快速排序函数)
- 如何利用C语言中的qsort库函数实现快速排序?
- 如何利用C语言中的qsort库函数实现快速排序
- C语言库函数中的排序和查找函数
- Java使用库函数排序
- VC中的SendMessage函数使用
- 快速排序中的partition函数详解
- 【rzxt】笔者支招:怎样在Win8系统的账号自动登录默认设置技巧
- 黑马程序员--03.Java面向对象--06.【final关键字】【抽象类】【接口】
- 什么是套接字(Socket)?套接字(Socket)是什么意思?(转载)
- 硬盘结构和原理
- android开发论坛
- 使用VC库函数中的快速排序函数
- 男子气概
- linux netlink机制
- OpenCV2.4.6 与VS2008,Python2.7.5配置和图像载入显示
- 什么是套接字(Socket)?套接字(Socket)是什么意思?(转载)
- poj 1125&&zoj1082 floyd
- poj 2420 A Star not a Tree?
- 配置Extjs的开发环境
- IplImage CBitmap HBITMAP BITMAP之间的相互转换