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

快速排序 C语言的qsort 以及 C++的 sort

2014-08-03 15:42 519 查看
排序方法很多。在最开始的时候 就只会个简单的冒泡/选择法排序。 随着ACM初期开始学, 随着TLE的到来

不得不去学习其他的方法,当初学习的地方忘记哪了。

qsort 函数的基本使用 头文件 #include <stdlib.h>

如果对 num
这个数组排序

形式: qsort(num,n,sizeof(s[0]),cmp);

其中 num 为 数组的首地址 , n为数组中要排序的元素的个数 sizeof() 即字节数 cmp为排序函数(需要自己写)。

下面接着讲 cmp函数的 int cmp(const void *a , const void * b)

一。 对int/char/double 的排序为 :(其中 对字符 double 的排序 只需要把 int 改成 char double )

int cmp(const void *a , const void * b){

return *(int *) a - *(int *)b; // 从小到大排序

}

int cmp(const void *a , const void * b){

return *(int *) b - *(int *)a; // 从大到小排序

}

用法样例:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int s[10000],n,i;

int cmp(const void *a,const void *b)

{

return(*(int *)b-*(int *)a); //实现的是升序排序

}

int main()

{

// 输入想要输入的数的个数

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d",&s[i]);

qsort(s,n,sizeof(s[0]),cmp);

for(i=0;i<n;i++)

printf("%d ",s[i]);

return(0);

}

四、对结构体一级排序

struct In

{

double data;

int other;

}s[100]



//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写



int cmp( const void *a ,const void *b)

{

return (*(In *)a).data > (*(In *)b).data ? 1 : -1;

//注意,这条语句在VC6.0环境下运行可能会出错,但是并不是语句错了,而是你要先 Build ,或者全部重建。总之语句是对的。

//或者你可以将这上面1条语句改成下面这3条语句

//struct In *aa = (In *)a;

//struct In *bb = (In *)b;

//return aa->data > bb->data ? 1 : -1;

}

qsort(s,100,sizeof(s[0]),cmp);



五、对结构体二级排序

struct In

{

int x; //你可以比喻成:失败次数

int y; //你可以比喻成:成功次数

}s[100];



//按照x从小到大排序,当x相等时按照y从大到小排序。 你可以想象成:失败是主要因素的一个问题,先比较 失败次数少,失败次数相同 再看 成功次数多。



int cmp( const void *a , const void *b )

{

struct In *c = (In *)a;

struct In *d = (In *)b;

if(c->x != d->x) return c->x - d->x;

else return d->y - c->y;

}

qsort(s,100,sizeof(s[0]),cmp);

C++的 sort 排序 sort 排序要比 qsort 高效

头文件 #include <algorithm>

num

sort(num,num + n); 是自身的调用 直接从小到大的排序

还有也是 sort(num , num + n , cmp) 是按照cmp的排序方式排序。 但是 sort 和qsort的 cmp 写法不同



int cmp(int a,int b)

{

if(a<b)

return 1; //升序排列,如果改为 a >b,则为降序,要注意sort()中cmp()的返值只有1和0,不像qsort中存在-1!!!!

else

return 0;

}
如果对结构体排序 二级排序

可以直接在结构体内部 写 operator < 对其进行重载即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: