利用归并排序
代码如下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//int count=0;
int merge(int* a,int first,int mid,int last,int* temp)
{
int i=mid,j=last;
int k,count=0;;
int index=last-first;
while(i>=first && j>=mid+1)
{
if(a[i]>a[j])
{
count+=j-mid;
for(k=mid+1;k<=j;k++)
printf("(%d,%d)\n",a[i],a[k]);
temp[index--]=a[i--];
}
else
{
temp[index--]=a[j--];
}
}
while(i>=first)
temp[index--]=a[i--];
while(j>=mid+1)
temp[index--]=a[j--];
for(i=0;i<=last-first;i++)
a[first+i]=temp[i];
return count;
}
void merge_sort(int* a,int first, int last, int* temp,int* count)
{
if(first<last)
{
int mid=(first+last)/2;
merge_sort(a,first,mid,temp,count);
merge_sort(a,mid+1,last,temp,count);
*count+=merge(a,first,mid,last,temp);
}
}
bool MergeSort(int* a,int n)
{
int* p;
int count=0;
p=(int*)malloc(sizeof(int)*n);
if(p==NULL)
return false;
merge_sort(a,0,n-1,p,&count);
printf("\n%4d\n",count);
free(p);
return true;
}
int main()
{
int a[6]={7,2,4,9,6,3};
int i;
if(MergeSort(a,6))
{
for(i=0;i<6;i++)
printf("%4d",a[i]);
}
return 0;
}