排序方法很多。在最开始的时候 就只会个简单的冒泡/选择法排序。 随着ACM初期开始学, 随着TLE的到来
不得不去学习其他的方法,当初学习的地方忘记哪了。
qsort 函数的基本使用 头文件 #include
如果对 num[n]这个数组排序
形式: 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
#include
#include
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
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;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
num[n]
sort(num,num + n); 是自身的调用 直接从小到大的排序
还有也是 sort(num , num + n , cmp) 是按照cmp的排序方式排序。 但是 sort 和qsort的 cmp 写法不同
如
int cmp(int a,int b)
{
if(a return 1; //升序排列,如果改为 a >b,则为降序,要注意sort()中cmp()的返值只有1和0,不像qsort中存在-1!!!!
else
return 0;
}