栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

一、题目描述二、分析

2.归并排序模板3.代码理解


一、题目描述

设A[1…n]是一个包含n个不同数的数组。如果在iA[j],则称(i,
j)为A中的一个逆序对。 例如,A=(2, 3,8, 6, 1)的逆序对有 21 31 81 86 61 共5个。

二、分析

1.读题 2.分析输入样例 3.思考数据类型 4.考虑时间复杂度 5.写程序
可使用冒泡和归并。冒泡时间复杂度O(n^2)~10 ^4 >10 ^5 舍弃,使用归并解决

2.归并排序模板

代码如下(示例):

class Solution {
	static int count= 0;//逆序对的个数
	void start(int [] a, int left,int right)
	{
		int n = a.length-1;
		int tempArr [] = new int [n];
		mergeSort(a,tempArr,left,right);
	}
	void mergeSort(int a[],int tempArr[], int left, int right)
	{
		if(left < right) 
		{	
		int mid = (left+right) / 2;
		mergeSort(a,tempArr,left,mid);
		mergeSort(a,tempArr,mid+1,right);
		merge_together(a, tempArr,left, right,mid);
		}
	}
	 void   merge_together(int a[],int tempArr[] , int left,int right,int mid)
	{
		int l = left;//左指针
		int m = mid+1;//右半边数组指针
		int k = left; //;临时数组第一个元素表示
		while(l<=mid && m<=right)
		{
			if(a[l] 
3.代码理解 

按照题目求逆序对,只需要在合并时添加count= (mid-l)+1即可。
模板分为进入 分组 合并 三部分,
在分组这一块中,用到了递归,递归讲究的是先递后归,即将整体分为左右,对左递,对右递,最后分为单个为一体的有序数组时停止,开始返回上一层运算。
在合并这一块中,对于所求逆序对为啥是count=mid-l+1,可以这样理解,经过分组后,未经合并前左右都是有序的,如果左边第一个数大于右边第一个数,即左边到分割线的数都大于右边第一个数,然后再执行对右边剩余的数放入临时数组。

如有错误,请及时指出,感谢观看!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/770665.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号