zoukankan      html  css  js  c++  java
  • 数组元素的逆序数

    求一个N个元素的逆序数

    例如:{1,5,2,6,3}的逆序数为:0+2+0+1+0=3

    最直接的求解逆序数方法时间复杂度为O(N^2)

    如果用分治的策略可以将时间复杂度降为O(N*logN),求N个元素的逆序数的分治思想如下:首先求前N/2个元素的逆序数,再求后N/2个

    元素的逆序数,最后在排序过程中合并前后两部分之间的逆序数

    实现代码如下:

    #include<iostream>
    using namespace std;
    int invalid_input=false;
    int cal_reverse(int *data,int len,int start,int end);
    int merge_reverse(int *data,int len,int start,int mid,int end);
    int main()
    {
    	int n;
    	cin>>n;
    	int *data=new int[n];
    	int i;
    	for(i=0;i<n;i++)
    		cin>>data[i];
    	int num=cal_reverse(data,n,0,n-1);
    	if(!invalid_input)
    		cout<<num<<endl;
    	else
    		cout<<"invalid input!"<<endl;
    	delete []data;
    	return 0;
    }
    int cal_reverse(int *data,int len,int start,int end)
    {
    	if(data==NULL||len<=0||start>end)
    	{
    		invalid_input=true;
    		return 0;
    	}
    	if(start==end)
    		return 0;
    	else
    	{
    		int mid=(start+end)>>1;
    		int leftnum=cal_reverse(data,len,start,mid);
    		int rightnum=cal_reverse(data,len,mid+1,end);
    		int mergenum=merge_reverse(data,len,start,mid,end);
    		return leftnum+rightnum+mergenum;
    	}
    }
    int merge_reverse(int *data,int len,int start,int mid,int end)
    {
    	int *temp=new int[len];
    	int i=start,j=mid+1,k=start,count=0;
    	while(i<=mid&&j<=end)
    	{
    		if(data[i]>data[j])
    		{
    			count=count+mid-i+1;
    			temp[k++]=data[j];
    			j++;
    		}
    		else
    		{
    			temp[k++]=data[i];
    			i++;
    		}
    	}
    	while(i<=mid)
    	{
    		temp[k++]=data[i];
    		i++;
    	}
    	while(j<=end)
    	{
    		temp[k++]=data[j];
    		j++;
    	}
    	for(i=start;i<=end;i++)
    		data[i]=temp[i];
    	delete []temp;
    	return count;
    }
    
    


  • 相关阅读:
    Mysql 之 编码问题
    Mysql Basic
    CentOS 之 Sublime text3 安装
    mapper映射
    端口号占用
    2020系统综合实验 第7次实践作业
    2020系统综合实验 第6次实践作业
    解决github打开速度慢问题
    2020系统综合实践 第5次实践作业
    2020系统综合实验 第4次实践作业
  • 原文地址:https://www.cnblogs.com/pangblog/p/3303878.html
Copyright © 2011-2022 走看看