统计数组中的逆序对
2013-06-19 10:29
316 查看
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
分析:借鉴归并排序的思想。
分析:借鉴归并排序的思想。
#include <stdio.h> int find_core(int *a, int *b, int start, int end) { if(start == end) return 0; int mid = (start+end)/2; int left = find_core(a,b,start,mid); int right = find_core(a,b,mid+1,end); int i = mid; int j = end; int k = end; int temp;//temp用于存储打印逆序对时的j值 int count = 0;//记录逆序对的个数 while(i>=start && j>=mid+1) { if(a[i] > a[j])//只有前面数组的元素大于后面数组的元素才算是逆序对 { temp = j;//记录当前的j值,为了打印逆序对 while(temp>=mid+1)//因为后面数组是由小到大排序好的,所以a[i]>a[j],也代表a[i]大于后面数组中a[j]前面所有的数,直到a[mid+1] { printf("%d %d\n",a[i],a[temp]); temp--; } b[k--] = a[i--];//当前值缓存到辅助数组,用于排序 count += j - (mid+1) + 1;//记录逆序对个数,a[i]和a[j]到a[i]和a[mid+1]都属于逆序对 } else//如果后面数组元素大于等于前面数组元素,则不是逆序对 { b[k--] = a[j--]; } } while(i>=start) b[k--] = a[i--]; while(j>=mid+1) b[k--] = a[j--]; for(i=start;i<=end;i++) a[i] = b[i]; return left + right + count;//left是前面数组内部统计的逆序对,right是后面数组内部统计的逆序对,count是两个数组之间统计的逆序对,所以不会存在重复问题 } int find(int *a, int *b, int len) { if(a==NULL || b==NULL || len<=0) return 0; int count = find_core(a,b,0,len-1); return count; } int main() { int a[] = {7,5,6,4}; int len = sizeof(a)/sizeof(int); int i; printf("数组为:\n"); for(i=0;i<len;i++) printf("%d\t",a[i]); printf("\n"); int *b = new int[len]; printf("逆序对为:\n"); int count = find(a,b,len); printf("共存在%d对逆序对\n",count); delete [] b; return 0; }
相关文章推荐
- 数组中逆序对统计方法
- 统计数组的逆序对
- 树状数组入门—逆序对统计
- 动态统计逆序对 (树状数组 twopointer)
- 统计数组中的逆序对的数量
- 归并排序及统计数组逆序对
- 算法导论第十四章习题14.1-7利用顺序统计数统计数组中的逆序数
- 积跬步至千里——算法强化训练(1)统计数组中的逆序对
- 关于int型整数按逆序存入数组中的问题(也即十进制数和其他类型数据的转换问题)
- POJ2299 树状数组求逆序数
- 统计`数组`元素出现的次数
- 剑指offer-38 统计一个数字在排序数组中出现的次数
- 删除数组中相同的数,统计两个数组中重复数个数并把不同数找出来
- 13周(数组统计成绩)
- Java控制台输入数组并逆序输出的方法实例[原创]_java_脚本之家
- awk数组计数和去重---统计域名访问次数
- Java-数组-统计字母的次数
- 数据结构-从归并排序到数组的逆序对数(微软面试题)
- javascript 数组分组统计
- 数组中的逆序对(归并排序思路)