题目2.给出一个算法,它能用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目
2013-01-25 15:41
543 查看
题目:
给出一个算法,它能用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目。
前提:
1.不考虑超大数据等特殊情况
代码:
总结:
本算法采用了分治的思想,改写了原先写好的归并/合并排序。在每次“合并”的时候,分别拿出右侧子序列中的元素,到左侧子序列中比较来得出部分逆序数。之后,再把三个部分的逆序数加在一起。与归并/合并排序类似,都是树形结构,故不难看出时间复杂度为O(nlgn)。
给出一个算法,它能用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目。
前提:
1.不考虑超大数据等特殊情况
代码:
#include<iostream> using namespace std; int CountInverseNumber(int a[],int p,int r); int merge_sort(int a[],int p,int r); int merge(int a[],int p,int q,int r); int main() { //测试数据 int a[11]={1,49,60,12,-12,101,121,62,60,8,-100}; int len=sizeof(a)/sizeof(a[0]); cout<<"result:"<<CountInverseNumber(a,0,len-1)<<endl; return 0; } //业务方法 int CountInverseNumber(int a[],int p,int r) { return merge_sort(a,p,r); } //改写归并排序算法,使之在合并的时候能够获逆序数。 int merge_sort(int a[],int p,int r) { int sum=0; int left=0; int right=0; int q=0; if(p<r) { q=(p+r)/2;//拆分待排序元素 left=merge_sort(a,p,q);//获取左侧子序列的逆序数 right=merge_sort(a,q+1,r);//获取右侧子序列的逆序数 sum=merge(a,p,q,r);//左、右子序列合并在一起时,子序列的逆序已经数好,这里要数剩余的那些逆序对的数量。 } return sum+left+right; } int merge(int a[],int p,int q,int r) { int n=0; int b_index=0; // int i=q,j=r; for(int k=r;k>=q+1;k--) { for(int h=q;h>=p;h--) { if(a[k]<a[h]) { n++; } } } return n; }
总结:
本算法采用了分治的思想,改写了原先写好的归并/合并排序。在每次“合并”的时候,分别拿出右侧子序列中的元素,到左侧子序列中比较来得出部分逆序数。之后,再把三个部分的逆序数加在一起。与归并/合并排序类似,都是树形结构,故不难看出时间复杂度为O(nlgn)。
相关文章推荐
- 题目:请给出一个运行时间为Θ(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。
- 题目1.请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个证书x时,判断出S中是否存在有两个其和等于x的元素。
- 2.3-7 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- 算法学习笔记----确定n个元素的任何排列中逆序对的数目
- 最坏情况快速排序的运行时间为Ο(nlgn)的算法
- 第九章中位数和顺序统计学 之 “寻找第i小元素之最坏情况线性时间的选择 最坏运行时间就为O(n)算法”
- 描述一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数 X 时,判断出S中是否存在有两个其和刚好等于 X 的元素。
- 一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS.
- 对于一个m*n的整数矩阵,其中每一行和每一列的元素都按升序排列,设计一个高效的算法判断一个数值是否存在,并给出位置
- 改进合并排序法以查找元素序列中的逆序对数量,最坏运行时间O( nlog2(n) )
- 提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin返回该数据结构的最小元素 所有操作在最坏的情况下的运行时间都是O(1)
- 在数组A中寻找第k小的元素-最坏情况为线性时间的算法
- 设M 是一个m×n 的矩阵,其中每行的元素从左到右单增有序,每列的元素从上到下单增有序。 给出一个分治算法计算出给定元素x 在M 中的位置或者表明x 不在M 中。分析算法的时间复杂性。
- 一个运行时间为nlgn的算法,能判断在集合S中是否有两数之和为x
- 寻找逆序对的算法,要求运行时间为O(nlgn),算法导论答案
- 设M 是一个m×n 的矩阵,其中每行的元素从左到右单增有序,每列的元素从上到下单增有序。 给出一个分治算法计算出给定元素x 在M 中的位置或者表明x 不在M 中。分析算法的时间复杂性。
- 一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS.
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 请给出一个时间为O(nlgk)、用来将k个已排序链表的算法。此处n为所有输入链表中元素的总数。