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

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

 2017-05-26 10:41
	    2017-05-26 10:41
  
 2017-05-26 11:05
	    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:14
   2017-05-31 19:39
	    2017-05-31 19:39
   ~
~										
					
	
 2017-05-31 20:16
	    2017-05-31 20:16
   
										
					
	 2017-05-31 20:24
	    2017-05-31 20:24