歸併排序求逆序對
阿新 • • 發佈:2019-02-09
One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than
four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions
(it is as unsorted as can be---exactly the reverse of sorted).
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
Input The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n. Output Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order. Sample Input
Sample Output
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
Input The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n. Output Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order. Sample Input
10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
題意:輸入n,m,有m行n個DNA,按逆序從小到,大輸出,(EAG)E比A大比G小,故只有逆序為1,思路:歸併排序我不理解,一開始只會冒泡求,但後來找到才理解一點#include<iostream> #include<cstdio> #include<algorithm> using namespace std; void mergesort(char x[],int begin,int end,int num); void merge(char x[],int begin,int mid,int end,int num); struct node { char a[52]; char b[52]; int sum; }mp[110]; char temp[52]; bool cmp(node x,node y) { return x.sum<y.sum; } int main() { int n,m,i,j; cin>>n>>m; for(i=1;i<=m;i++) { cin>>mp[i].a; mp[i].sum=0; strcpy(mp[i].b,mp[i].a); mergesort(mp[i].b,0,n-1,i); } sort(mp+1,mp+1+m,cmp); for(i=1;i<=m;i++) { cout<<mp[i].a<<endl; } } void mergesort(char x[],int begin,int end,int num) { int mid; if(begin<end) { mid=(begin+end)/2; mergesort(x,begin,mid,num); mergesort(x,mid+1,end,num); merge(x,begin,mid,end,num); } } void merge(char x[],int begin,int mid,int end,int num) { int i,j,k=0; i=begin,j=mid+1; while(i<=mid&&j<=end) { if(x[i]<=x[j]) { temp[k++]=x[i++]; } else { mp[num].sum+=mid-i+1; temp[k++]=x[j++]; } } while(i<=mid) { temp[k++]=x[i++]; } while(j<=end) { temp[k++]=x[j++]; } for(i=0;i<k;i++) { x[begin+i]=temp[i]; } }