A计划---POJ2299 Ultra-QuickSort

Posted 光光-Leo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A计划---POJ2299 Ultra-QuickSort相关的知识,希望对你有一定的参考价值。

A题不分早晚

对于刚入坑的我来说,这道题还是有点难度的。

最初使用二分插入排序计算的,但这个算法虽然相对直接插入排序性能优化了不少,平均复杂度为O(nlogn),但最坏情况下时间复杂度为O(n2),所以超时了。

后来经过提示知道这是一道逆序数的题,可以使用归并排序实现,时间复杂度为O(nlogn), 不过需要注意的一个地方是题目中给定的数据范围是50W,所以使用最大情况下结果会超出int的存储范围。

import java.util.Scanner;

public class Main 

	public static int data[] = null;
	public static long step;
	
	public static void sort(int left,int right,int temp[])
		if(left<right)
			int mid = (left+right)/2;
		    sort(left,mid,temp);
		    sort(mid+1,right,temp);
		    sortMerge(left,mid,right,temp);
		
	
	public static void sortMerge(int left,int mid,int right,int temp[])
		int i = left;
		int j = mid+1;
		int t = 0;
		while(i<=mid&&j<=right)
			if(data[i]<=data[j])
				temp[t++] = data[i++];
			else
				temp[t++] = data[j++];
				step+=mid-i+1;
			 
		
		
		while(i<=mid)
			temp[t++] = data[i++];
		
		while(j<=right)
			temp[t++] = data[j++];
		
		t=0;
		while(left<=right)
			data[left++] = temp[t++];
		
	
	public static void main(String[] args) 
		Scanner sc = new Scanner(System.in);
		int s;
		while((s=sc.nextInt())!=0)
			data = new int[s];
			for(int i=0;i<s;i++)
				data[i] = sc.nextInt();
			
			step=0L;
			int temp[] = new int[data.length];
			Main.sort(0,data.length-1,temp);
			System.out.println(step);
		
	




以上是关于A计划---POJ2299 Ultra-QuickSort的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2299.Ultra-QuickSort

归并排序求逆序对poj2299

POJ 2299 -Ultra-QuickSort-树状数组求逆序数

poj2299 树状数组入门题

Poj 2299 - Ultra-QuickSort 离散化,树状数组,逆序对

poj 2299 Ultra-QuickSort 逆序对模版题