POJ 2299 Ultra-QuickSort 简单题解

本文详细解析了Ultra-QuickSort算法的工作原理,并通过归并排序方法优化了其性能,具体步骤包括输入序列读取、归并排序实现及输出结果计算。此算法适用于求解逆序对数量,具有较高的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536K
Total Submissions: 68874 Accepted: 25813

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

Source

 
 
题目大意:求一组数据的逆序对,有多组数据,每组数据以一个n开头,读入以0结尾。
 
做法:归并排序(裸题)
 
代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #define N 500007
 6 #define LL long long
 7 using namespace std;
 8 int n;
 9 LL a[N], b[N], ans;
10 
11 inline LL read()
12 {
13     LL s = 0;
14     char ch = getchar();
15     while (ch < '0' || ch > '9')    ch = getchar();
16     while (ch >= '0' && ch <= '9')     s = s * 10 + ch - '0', ch = getchar();
17     return s;
18 }
19 
20 inline void merge(int l, int mid, int r)
21 {
22     int i = l, j = mid + 1;
23     for (int k = l; k <= r; k++)
24         if (j > r || i <= mid && a[i] < a[j])    b[k] = a[i++];
25         else b[k] = a[j++], ans += mid - i + 1;
26     for (int k = l; k <= r; k++)    a[k] = b[k];
27 }
28 
29 inline void mergeSort(int a, int b)
30 {
31     int mid = (a + b) / 2;
32     if (a < b)
33     {
34         mergeSort(a, mid);
35         mergeSort(mid + 1, b);
36         merge(a, mid, b); 
37     }
38 }
39 
40 int main()
41 {
42     while(scanf("%d", &n) && n != 0)
43     {
44         ans = 0;
45         for (int i = 1; i <= n; i++)
46             a[i] = read();
47         mergeSort(1, n);
48         cout << ans << endl;
49     }
50 }

 

转载于:https://www.cnblogs.com/traveller-ly/p/Ultra-QuickSort.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值