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


排序方法很多。在最开始的时候 就只会个简单的冒泡/选择法排序。  随着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;iscanf("%d",&s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;iprintf("%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  


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;
}

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

可以直接在结构体内部  写  operator  <  对其进行重载即可。


你可能感兴趣的:(高效算法)