C++ sort和qsort有关总结
2016-07-25 16:39
183 查看
【qsort】
qsort(quicksort)函数是ANSI
C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)。基本快速排序的方法,每次把数组分成两分和中间的一个划分值,而对于有多个重复值的数组来说,基本排序的效率较低。
集成在C语言库函数里面的的qsort函数,使用三路划分的方法解决这个问题。所谓三路划分:是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分。 qsort主要根据你给的比较条件给一个快速排序,主要是通过指针移动实现排序功能。排序之后的结果仍然放在原来数组中。
qsort中几种常见的comp函数:
【sort】
std::sort是一个改进版的qsort。std::sort函数优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。默认sort排序后是升序,如果想让他降序排列,可以使用自己编的cmp函数,比如按照学生的年龄进行排序,年龄相同的时按照名字进行排序:
void __fileDECL qsort ( void *base,//需要排序的目标数组首地址 size_t num,//目标数组元素个数 size_t width,//目标数组中每一个元素长度 int (__fileDECL *comp)(const void *, const void *)//函数指针,指向比较函数 )
qsort(quicksort)函数是ANSI
C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)。基本快速排序的方法,每次把数组分成两分和中间的一个划分值,而对于有多个重复值的数组来说,基本排序的效率较低。
集成在C语言库函数里面的的qsort函数,使用三路划分的方法解决这个问题。所谓三路划分:是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分。 qsort主要根据你给的比较条件给一个快速排序,主要是通过指针移动实现排序功能。排序之后的结果仍然放在原来数组中。
qsort中几种常见的comp函数:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <intrin.h> int cmp_int(const void *x, const void *y) { return *(int*)x - *(int*)y; } int cmp_double(const void *x, const void *y) { return (*(double*)x > *(double*)y ? 1 : -1); } struct Student { char name[30]; int age; }; //对年龄排序,年龄相同再按姓名排序 int cmp_student (const void *x, const void *y) { //先指针转换,再按要求比较 Student *pStuX = (Student*)x; Student *pStuY = (Student*)y; if (pStuX->age != pStuY->age) { return pStuX->age - pStuY->age; } else { return strcmp(pStuX->name, pStuY->name); } } //按指定方式进行排序 //如对只有大小写字母的字符串进行排序,要求大写字母在前,小写字母在后 int cmp_char(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; } void show() { printf("select func choice:\n"); printf("[ 0 ]: compare int\n"); printf("[ 1 ]: compare double\n"); printf("[ 2 ]: compare struct\n"); printf("[ 3 ]: compare char\n\n"); } int main() { show(); int choice; while (scanf("%d", &choice)) { switch (choice) { case 0: { /*int a[] = {1,2,8,4}; qsort(a, 4, sizeof(a[0]), cmp_int);*/ printf("your choice %d\n", choice); int n; scanf("%d",&n); int *ary = (int*)malloc(n*sizeof(int)); for(int i=0; i<n; i++) { scanf("%d",(ary+i)); } qsort(ary, n, sizeof(int), cmp_int); for(int i=0; i<n; i++) { printf("%d\t",ary[i]); } } break; case 1: { printf("your choice %d\n", choice); double b[] = {2.341, 1.234, 4.567, 3.459}; qsort(b, 4, sizeof(b[0]), cmp_double); for (int i=0; i<4; ++i) { printf("%f\n", b[i]); } } break; case 2: { printf("your choice %d\n", choice); Student a[] = { {"A", 13}, {"B", 14}, {"R", 12}, {"K", 12}, {"N", 11}}; qsort(a, 5, sizeof(a[0]), cmp_student); for (int i=0; i<5; ++i) { printf("name:%s, age:%d\n", a[i].name, a[i].age); } } break; case 3: { printf("your choice %d\n", choice); char szText[] = "AcbdaBDCzxyw"; qsort(szText, strlen(szText), sizeof(szText[0]), cmp_char); printf("%s\n", szText); } break; default: return 0; } show(); } getchar(); return 0; }
【sort】
std::sort是一个改进版的qsort。std::sort函数优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。默认sort排序后是升序,如果想让他降序排列,可以使用自己编的cmp函数,比如按照学生的年龄进行排序,年龄相同的时按照名字进行排序:
#include<iostream> #include<algorithm> using namespace std; struct _student { char name[30]; int age; }; //按年龄进行排序,年龄相同则按照名字排序 bool comp(_student a, _student b) { if (a.age != b.age) { return a.age < b.age; } else { return strcmp(a.name, b.name) > 0; } }; int main() { _student stu[] = { {"A", 13}, {"B", 15}, {"C", 12}, {"K", 11}, {"D", 12}}; sort(stu, stu+5, comp); for (int i=0; i<5; ++i) { printf("name:%s, age:%d\n", stu[i].name, stu[i].age); } return 0; }
相关文章推荐
- C++单例模式设计与实现
- C++ QQ游戏 连连看外挂 内存挂入门
- c++ smart pointer
- poj1322Chocolate(724训练题)解析
- C++11 —— 基于区间(range)的 for 循环
- C++封装POSIX 线程库(一)互斥锁的封装
- C#学习笔记 对比C++
- 【C++】类 与继承
- 【C/C++】关键字之sizeof(sizeof()用法汇总)
- RAII惯用法:C++资源管理的利器
- C++ PDFLib 8.0 中文输出
- 1104. Sum of Number Segments (20)
- C++ Primer 第二章 引用 指针 const限定符
- C语言指针笔记
- C++/C语言函数:isalpha()函数 isdigit(int c)宏
- 大话设计模式19----组合模式
- C++——queue
- c++ 输出参数
- 2016003 VS2008MFC扩展动态库与调用示例
- c语言描述的顺序表实现