使用qsort对结构体的数据排序

1007 DNA 排序

题目大意:

序列“未排序程度”的一个计算方式是元素乱序的元素对个数。例如:在单词序列“DAABEC‘”中,因为D大于右边四个单词,E大于C,所以计算结果为5。这种计算方法称为序列的逆序数。序列“AACEDGG”逆序数为1(E与D)——近似排序,而序列``ZWQM‘‘ 逆序数为6(它是已排序序列的反序)。

你的任务是分类DNA字符串(只有ACGT四个字符)。但是你分类它们的方法不是字典序,而是逆序数,排序程度从好到差。所有字符串长度相同。

输入:

第一行包含两个数:一个正整数n(0<n<=50)表示字符串长度,一个正整数m(0<m<=100)表示字符串个数。接下来m行,每行一个长度为n的字符串。

输出:

输出输入字符串列表,按排序程度从好到差。如果逆序数相同,就原来顺序输出。

样例输入:

10 6

AACATGAAGG

TTTTGGCCAA

TTTGGCCAAA

GATCAGATTT

CCCGGGGGGA

ATCGATGCAT

样例输出:

CCCGGGGGGA

AACATGAAGG

GATCAGATTT

ATCGATGCAT

TTTTGGCCAA

TTTGGCCAAA

#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*使用结构体存储字符串和对应的逆序数。
如果把字符串和逆序数分开,排序之后字符串和逆序数将会无法对应*/
struct String{
    int numOfReverse;
    char chars[55];
}str[100];
/*qsort的cmp函数参数默认为:const void *p,const void *q;数据类型不能改变。在赋值之前要对指针进行强制类型转换。*/
int cmp(const void *p,const void *q){
    String a = *(String *)p;
    String b = *(String *)q;
    return (a.numOfReverse - b.numOfReverse);
}

int calcNumOfReverse(char *s){
    int i,j;
    int cnt = 0,leap = 1,sum = 0;
    for(i=0;i<strlen(s);i++){
        for(j=i+1;j<strlen(s);j++){
            if(s[j]<s[i]){
                cnt++;
            }
        }
        sum += cnt;
        cnt = 0;
    }
    return sum;
}
int main(void){
    int col,row;
    int i,j,k;
    scanf("%d %d",&col,&row);
    for(i=0;i<row;i++){
        scanf("%s",str[i].chars);//数据输入
    }
    for(i=0;i<row;i++){
        str[i].numOfReverse = calcNumOfReverse(str[i].chars);
    }
    qsort(str,row,sizeof(str[0]),cmp);
    for(i=0;i<row;i++){
        printf("%s\n",str[i].chars);
    }
    return 0;
}
时间: 2024-10-13 02:05:43

使用qsort对结构体的数据排序的相关文章

4.19 使用qsort对结构体数组进行排序,实现对结构的体一级排序和二级排序,进一步了解qsort的原理

qsort对结构体数组进行排序时,可以根据结构体元素中的任意某个成员进行比较之后,如果要交换则会连带结构体中其他成员的一起进行整体的结构体元素交换所以感觉真是万能排序接口 只进行对结构体的一级排序 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct _stu { char name[10]; float score; }Stu; int callBackCompare(con

sort+结构体实现二级排序

之前介绍的sort函数由于其效率较高,使用较为简单让我用起来那叫一个爽,今天再写一篇使用sort+结构体实现二级排序的方法. 还是先想个问题吧,比如我想输入5个同学的名字和身高,然后得到他们身高的降序,但是如果出现相同身高的情况,名字的拼音靠前的排在前面. 好,现在这个问题已经涉及到了二级排序,要按照身高的降序和姓名的升序排列,那么就要先定义一个结构体,将姓名和身高都包含进去,然后用sort对结构体排序,而实现二级排序,关键在于自己写的cmp函数(sort的比较方法) 1 #include<io

计算机二级-C语言-程序填空题-190112记录-结构体的遍历和结构体的数据的交换处理,文件的操作。

//程序设计题:学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数低的学生数据放在b所指的数组中,注意:分数最低的学生可能不止一个,函数返回分数最低的学生人数. //重难点:结构体的定义.结构体的使用.文件指针的定义.对文件的操作.输出格式'%4d'.两种方法获取最小值. 1 #include <stdio.h> 2 #define N 16 3 typedef struct//定义一个新结构体类型 4 { char num[10];

结构体数组的排序

按照结构体数组的某一项排序,那么一个结构体包含的元素仍保持不变 结果如下: 代码: 1 #include<algorithm> 2 #include<iostream> 3 using namespace std; 4 5 const int M = 3; 6 7 struct two { 8 double w; 9 double v; 10 }ss[M]; 11 bool cmp(two a,two b) 12 { 13 return a.v > b.v; //按照从大到小

C结构体中数据的内存对齐问题

转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一般默认8字节对齐(64位机机器字长8字节) 1.先看下面的例子:struct A{   char c1;   int i;   short s;   int j;}a; struct B{   int i;   int j;     short s;   char c1;}b; 结构A没有遵守字节对

c++结构体双关键字排序

1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node{ 4 int l,r; 5 }num[100010]; 6 int w_comp(const node &a,const node &b){ 7 if (a.l!=b.l) return a.l>b.l;//先比较第一个关键字,从大到小排序 8 return a.r<b.r;//比较第二个关键字,从小到大排序 9 } 10 int main(

c/c++ qsort 函数 结构体简单使用(1)

1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 typedef struct student { 6 char *name; 7 }; 8 9 void scan(student stu[], int &n){ 10 char str[1024]; 11 scanf("%d", &n); 12 for(int i = 0; i < n; +

题目1013:开门人和关门人(结构体自定义cmp排序)

题目链接:http://ac.jobdu.com/problem.php?pid=1013 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1013 开门人和关门人.cpp // Jobdu // // Created by PengFei_Zheng on 28/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <st

结构体-输入成绩排序

输入指定数量学生的姓名.语文.数学成绩,按总分从高到低排序 代码: #include <iostream> #include <string> #include <algorithm> using namespace std; struct stu { string name; int yw,sx,zf; } a[100]; int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[