第一题~
冒泡排序交换次数就是逆序对个数~
同理可得~归并排序数据变动次数以及排序数组长度可以推测逆序对个数~
[此贴子已经被作者于2017-5-26 18:33编辑过]
2017-05-26 10:23
[此贴子已经被作者于2017-5-26 18:33编辑过]

2017-05-26 10:35
[此贴子已经被作者于2017-5-26 10:48编辑过]

2017-05-26 10:41

2017-05-26 11:05
程序代码:#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);
}
}

2017-05-31 19:14
2017-05-31 19:39
~

2017-05-31 20:16
2017-05-31 20:24