第一题~
冒泡排序交换次数就是逆序对个数~
同理可得~归并排序数据变动次数以及排序数组长度可以推测逆序对个数~
[此贴子已经被作者于2017-5-26 18:33编辑过]
[此贴子已经被作者于2017-5-26 18:33编辑过]
[此贴子已经被作者于2017-5-26 10:48编辑过]
#include<stdio.h> #include<cstdio> #include<cstring> int n; int a[20]; int cnt; void query(int a[], int first, int mid, int last, int tmp[]){ int i = first, j = mid+1; int k = 0; while(i <= mid && j <= last){ if(a[i] <= a[j]) tmp[k++] = a[i++]; else{ tmp[k++] = a[j++]; cnt += mid-i+1; } } while(i <= mid){ tmp[k++] = a[i++]; } while(j <= last){ tmp[k++] = a[j++]; } for(int id = 0; id < k; id++){ a[first + id] = tmp[id]; } } void merge_sort(int* a, int L, int R, int* tmp){ if(L < R){ int M = L + (R-L)/2; merge_sort(a,L,M,tmp); merge_sort(a,M+1,R,tmp); query(a,L,M,R,tmp); } } int main(){ scanf("%d",&n); for(int i = 0; i < n; i++){ scanf("%d",&a[i]); } int tmp[20]; cnt = 0; merge_sort(a,0,n-1,tmp); for( i = 0; i < n; i++){ printf("%d ",a[i]); } printf("cnt = %d\n",cnt); printf("\n"); return 0; }
#include<stdio.h> #include<stdlib.h> int getMin(int[],int);//求最优合并算法比较次数 int getMax(int[],int);//求最差合并算法比较次数 void quick_sort(int*,int,int);//快速排序,用来对各序列根据序列长度按从小到大排序 int main() { int data[100],n,i,min,max; printf("请输入待合并的序列总个数K:\n"); scanf("%d",&n); printf("请依次输入这些序列中的元素个数:\n"); for(i=1;i<=n;i++) scanf("%d",&data[i]); quick_sort(data,1,n); max = getMax(data,n); min = getMin(data,n); printf("1.最优合并算法的比较次数为:%d\n2.最差合并算法的比较次数为 %d\n",min,max); system("pause"); return 0; } int getMin(int data[100],int n) { int sum=0,i; if(n==1) return data[n]; for(i=1;i<n;i++) { sum+=data[i]+data[i+1]-1; data[i+1]=data[i]+data[i+1]; quick_sort(data,i+1,n); } return sum; } int getMax(int data[],int n) { int i,sum=0,amount;//sum记录当前比较次数的总和,amount当前最大序列的长度 amount = data[n]; if(n==1) return amount; for(i=n-1;i>=1;i--) { sum += amount+data[i]-1;//当前最大两个序列合并需要的比较次数 amount +=data[i];//合并两个序列后,当前最大序列的长度 } return sum; } void quick_sort(int s[], int l, int r) { if(l<r) { int i=l, j=r, x=s[l];//取第一个做数做基准,用x表示 while(i<j) { while(i<j && s[j]>= x) // 从右向左找第一个小于x的数 j--; if(i<j) s[i++]=s[j]; while(i<j && s[i]< x) // 从左向右找第一个大于等于x的数 i++; if(i<j) s[j--]=s[i]; } s[i] = x; quick_sort(s, l, i-1); // 递归调用 quick_sort(s, i+1, r); } }