逆序数

来源:互联网 发布:php 博客系统 编辑:程序博客网 时间:2024/04/29 13:36

#问题

对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。

如2431中,21,43,41,31是逆序,逆序数是4

#解法

1.枚举--复杂度o(n^2)

2.归并排序--复杂度o(nlogn)

int is1[n],is2[n];// is1为原数组,is2为临时数组,n为个人定义的长度long mergeSort(int a,int b)// 下标,例如数组int is[5],全部排序的调用为mergeSort(0,4){if(a<b){int mid=(a+b)/2;long count=0;count+=mergeSort(a,mid);count+=mergeSort(mid+1,b);count+=merge(a,mid,b);return count;}return 0;}long merge(int low,int mid,int high){int i=low,j=mid+1,k=low;long count=0;while(i<=mid&&j<=high)if(is1[i]<=is1[j])// 此处为稳定排序的关键,不能用小于is2[k++]=is1[i++];else{is2[k++]=is1[j++];count+=j-k;// 每当后段的数组元素提前时,记录提前的距离}while(i<=mid)is2[k++]=is1[i++];while(j<=high)is2[k++]=is1[j++];for(i=low;i<=high;i++)// 写回原数组is1[i]=is2[i];return count;}


整理自:百度百科http://baike.baidu.com/view/184395.htm?fr=aladdin

0 0
原创粉丝点击