您的位置:首页 > 编程语言 > C语言/C++

C++ sort和qsort有关总结

2016-07-25 16:39 183 查看
【qsort】

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: