第一次写博文啊,菜鸟,绝对菜鸟,贴出来是给自己一些学习动力而已,呵呵
这些天闲着没事,又看了看算法导论,以前学习数据结构与算法时也怎么仔细看过这书,但是经典的著作还是得看滴,所以趁现在有点时间就写了点代码。
逆序计数就是把对那些i<j,但是a[i]>a[j]的数对进行计数。
下面代码不是很严谨,仅供参考。
#include<stdio.h>
#include<stdlib.h>
int arr[10]={2,4,5,8,1,3,0,9,7,6};
int num=0;//记录逆序数对个数
void merge(int a,int b);
void sort(int a,int mid,int b);
void main(){
int i;
merge(0,9);
for(i=0;i<10;i++){
printf("%d ",arr[i]);
}
printf("/n");
printf("%d",num);
getchar();
}
void sort(int a,int mid,int b){
int *c;
int i,j;
c=(int *)malloc(sizeof(int)*(b-a+1));
int k=0;
for(i=a,j=mid+1;i<=mid && j<=b;){
if(arr[i]<=arr[j]){
c[k]=arr[i];
k++;
i++;
}else{
c[k]=arr[j];
num = num+mid-i+1;
j++;
k++;
}
}
while(i<=mid){
c[k]=arr[i];
i++;
k++;
}
while(j<=b){
c[k]=arr[b];
j++;
k++;
}
for(i=0,j=a;i<=b-a;i++,j++){
arr[j]=c[i];
}
free(c);
}
//对a-b下标数组操作
void merge(int a,int b){
int mid=(a+b)/2;
if(a+1>=b){
sort(a,mid,b);
}
else{
merge(a,mid);
merge(mid+1,b);
sort(a,mid,b);
}
}
运行结果:
0 1 2 3 4 5 6 7 8 9
18