逆序计数

第一次写博文啊,菜鸟,绝对菜鸟,贴出来是给自己一些学习动力而已,呵呵

这些天闲着没事,又看了看算法导论,以前学习数据结构与算法时也怎么仔细看过这书,但是经典的著作还是得看滴,所以趁现在有点时间就写了点代码。

逆序计数就是把对那些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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值