[归并排序]Ultra-QuickSort
Posted lz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[归并排序]Ultra-QuickSort相关的知识,希望对你有一定的参考价值。
Description
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Ultra-QuickSort produces the output
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
题意:要求使序列变为递增序列的最小交换相邻元素的次数;
思路:归并排序求逆序数;
AC代码:
#include <iostream> #include<cstdio> #include<algorithm> #define N 500010 typedef long long ll; using namespace std; ll a[N]; ll ans=0; ll tmp[N]; void merge_(int l,int m,int r){ int cnt=0; int i,j; for(i=l,j=m+1;i<=m&&j<=r;){ if(a[i]<=a[j]) {tmp[++cnt]=a[i]; i++;} else{ tmp[++cnt]=a[j]; j++; ans+=(m-i+1); } } while(i<=m) {tmp[++cnt]=a[i]; i++;} while(j<=r) {tmp[++cnt]=a[j]; j++;} for(i=l,j=1;i<=r&&j<=cnt;i++,j++) a[i]=tmp[j]; } void merge_sort(int l,int r){ if(l==r) return; if(l<r){ int m=(l+r)>>1; merge_sort(l,m); merge_sort(m+1,r); merge_(l,m,r); } } int main() { int n; while(scanf("%d",&n)!=EOF&&n){ for(int i=1;i<=n;i++) cin>>a[i]; ans=0; merge_sort(1,n); cout<<ans<<endl; } return 0; }
配图不是很懂啊?
以上是关于[归并排序]Ultra-QuickSort的主要内容,如果未能解决你的问题,请参考以下文章
POJ - 2299 Ultra-QuickSort(归并排序)
归并排序+逆序数poj-2299 Ultra-QuickSort
POJ - 2299 - Ultra-QuickSort = 归并排序 + 逆序对 / 树状数组