[关闭]
@Archger 2016-10-10T21:24:53.000000Z 字数 2029 阅读 1051

用到qsort的一道题(+qsort模板)

STL qsort 排序 模板


大致题意:
输入m个长度为n的DNA序列,把他们按照逆序数从小到大稳定排序输出。
PS:“稳定排序”就是当序列中出现A1==A2时,排序前后A1与A2的相对位置不发生改变。

解题思路:
没难度,先求各个字符串的逆序数,再按逆序数对字符串快排,用qsort()函数。
虽然快排不是稳定的排序,但是只要在定义排序规则函数cmp做适当处理,a==b时返回0,即不处理a和b,就不会改变他们之间的相对位置了。

  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4. struct DNA{
  5. string s;
  6. int value;
  7. };
  8. int cmp(const DNA *a, const DNA *b) { return (a->value-b->value); }
  9. int main()
  10. {
  11. int n,m;
  12. while(cin>> m >>n)
  13. {
  14. DNA it[n];
  15. for(int i=0;i!=n;i++)
  16. {
  17. cin >> it[i].s;
  18. it[i].value = 0;
  19. for(int j=0;j!=m;j++)
  20. for(int k=j+1;k!=m;k++)
  21. if(it[i].s[j]>it[i].s[k]) it[i].value++;
  22. }
  23. qsort(it,n,sizeof(DNA), (int (*)(const void *, const void *))cmp);
  24. for(int i=0;i!=n;i++)
  25. cout << it[i].s <<endl ;
  26. }
  27. return 0;
  28. }

注意qsort的调用和声明方法

qsort的比较函数返回值是int类型


七种qsort排序方法

<本文中排序都是采用的从小到大排序>

一、对int类型数组排序

  1. int num[100];
  2. Sample:
  3. int cmp ( const void *a , const void *b )
  4. {
  5. return *(int *)a - *(int *)b;
  6. }
  7. qsort(num,100,sizeof(num[0]),cmp);

二、对char类型数组排序(同int类型)

  1. char word[100];
  2. Sample:
  3. int cmp( const void *a , const void *b )
  4. {
  5. return *(char *)a - *(int *)b;
  6. }
  7. qsort(word,100,sizeof(word[0]),cmp);

三、对double类型数组排序(特别要注意)

  1. double in[100];
  2. int cmp( const void *a , const void *b )
  3. {
  4. return *(double *)a > *(double *)b ? 1 : -1;
  5. }
  6. qsort(in,100,sizeof(in[0]),cmp);

四、对结构体一级排序

  1. struct In
  2. {
  3. double data;
  4. int other;
  5. }s[100]
  6. //按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写
  7. int cmp( const void *a ,const void *B)
  8. {
  9. return (*(In *)a)->data > (*(In *)B)->data ? 1 : -1;
  10. }
  11. qsort(s,100,sizeof(s[0]),cmp);

五、对结构体二级排序

  1. struct In
  2. {
  3. int x;
  4. int y;
  5. }s[100];
  6. //按照x从小到大排序,当x相等时按照y从大到小排序
  7. int cmp( const void *a , const void *b )
  8. {
  9. struct In *c = (In *)a;
  10. struct In *d = (In *)b;
  11. if(c->x != d->x) return c->x - d->x;
  12. else return d->y - c->y;
  13. }
  14. qsort(s,100,sizeof(s[0]),cmp);

六、对字符串进行排序

  1. struct In
  2. {
  3. int data;
  4. char str[100];
  5. }s[100];
  6. //按照结构体中字符串str的字典顺序排序
  7. int cmp ( const void *a , const void *b )
  8. {
  9. return strcmp( (*(In *)a)->str , (*(In *)B)->str );
  10. }
  11. qsort(s,100,sizeof(s[0]),cmp);

七、计算几何中求凸包的cmp

  1. int cmp(const void *a,const void *B) //重点cmp函数,把除了1点外的所有点,旋转角度排序
  2. {
  3. struct point *c=(point *)a;
  4. struct point *d=(point *)b;
  5. if( calc(*c,*d,p[1]) < 0) return 1;
  6. else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面
  7. return 1;
  8. else return -1;
  9. }
  10. :

c++中加载头文件 "iostream"

c中qsort函数包含在的头文件里,strcmp包含在的头文件里

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注