您的位置:首页 > 其它

ACM: 计算交换次数的排序题 poj 22…

2016-05-19 23:17 429 查看
                                                                 
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.

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

题意: 将序列排序,从小到大.计算交换的次数,交换只可以和左右相邻的数字交换.

 

解题思路:

               
1. 交换排序的类型,选择归并排序.

               
2. 计算二路归并的时候, mid - p + 1 (p: 序列的下标,mid: 是二分的中介.)

 

代码:

#include <cstdio>

#include <iostream>

using namespace std;

#define MAX 500003

int a[MAX];

int t[MAX];

int n;

long long merge_sort(int start,int end,int len)

{

    if(len ==
0)

  
   
 return 0;

    long long
cur = 0;

    int mid =
(start+end) / 2;

    cur +=
merge_sort(start,mid,mid-start);

    cur +=
merge_sort(mid+1,end,end-mid-1);

    int p =
start , q = mid+1;

    int k =
start;

    

    for(int i =
0; i <= len; ++i)

    {

  
   
 if(q > end || (p <=
mid && a[p] <
a[q]))

  
   
   
 t[k++] = a[p++];

  
   
 else

  
   
 {

  
   
   
 cur += mid-p+1;

  
   
   
 t[k++] = a[q++];

  
   
 }

    }

    for(;start
<= end; ++start)

  
   
 a[start] = t[start];

    return
cur;

}

int main()

{

//  
 freopen("input.txt","r",stdin);

  
 while(scanf("%d",&n) != EOF
&& n != 0)

    {

  
   
 for(int i = 0; i < n; ++i)

  
   
 {

  
   
   
 scanf("%d",&a[i]);

  
   
 }

  
   
 printf("%lld\n",merge_sort(0,n-1,n-1));

    }

    return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: