给定一个无序的数列,由32位整数组成的,序列长度可达500000,现在通过不断的两两交换,把这个序列排成由小到大的有序序列,问交换的次数是多少。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define NN 500005
 4
 5 int a[NN];
 6 __int64 count;
 7
 8 void Merge(int data[], int l, int m, int r)
 9 {
10     int i = l;
11     int j = m + 1;
12     int k = 0;
13     int *pd;
14     pd = (int*)malloc((r-l+1) * sizeof(int));//归并
15
16     while (i<=m && j<=r)
17     {
18         if (data[i] <= data[j])
19         {
20             pd[k++] = data[i++];
21         }
22         else
23         {
24             pd[k++] = data[j++];
25             count += m - i + 1;
26         }
27     }
28     while (i <= m)
29     {
30         pd[k++] = data[i++];
31     }
32     while (j<=r)
33     {
34         pd[k++] = data[j++];
35     }
36     for (i=l, k=0; i<=r; i++, k++)
37     {
38         data[i] = pd[k];
39     }
40     free(pd);
41     //pd = NULL;
42 }
43
44 void MergeSort(int data[], int l, int r)
45 {
46     if (l < r)
47     {
48         int m= (l + r) / 2;
49         MergeSort(data, l, m);
50         MergeSort(data, m+1, r);
51         Merge(data, l, m, r);
52     }
53 }
54
55 int main(void)
56 {
57     int n;
58     //int i;
59     while (scanf("%d", &n), n)
60     {
61         count = 0;
62         for (int i=0; i<n; i++)
63         {
64             scanf("%d", &a[i]);
65         }
66         MergeSort(a, 0, n-1);
67         printf("%I64d\n", count);
68     }
69     return 0;
70 }

转载于:https://www.cnblogs.com/bucuo/archive/2012/11/15/2772157.html

poj 2299 (归并排序)相关推荐

  1. poj 2299 Ultra-QuickSort

    http://poj.org/problem?id=2299 归并排序 代码: #include<iostream> #include<stdio.h> #include< ...

  2. POJ 2299 Ultra-QuickSort(线段树+离散化)

    题目地址:POJ 2299 这题以前用归并排序做过.线段树加上离散化也能够做.一般线段树的话会超时. 这题的数字最大到10^10次方,显然太大,可是能够利用下标,下标总共仅仅有50w.能够从数字大的開 ...

  3. Ultra-QuickSort POJ 2299(归并排序)

    http://acm.hust.edu.cn/vjudge/contest/124435#problem/D 题意:给出一个长度为n的数列,你每一次可以随意交换其中两个数字的位置.问你至少交换几次,才 ...

  4. POJ - 2299 Ultra-QuickSort(线段树+离散化/归并排序)

    题目链接:点击查看 题目大意:给出n个数字,求使用冒泡排序所需要交换的次数 题目分析:这个题n给到了5e5,如果直接冒泡排序的话,的时间复杂度肯定就TLE了,所以不能直接暴力模拟 我们换个思路,这个题 ...

  5. poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)

    题目链接:http://poj.org/problem?id=2299 Description In this problem, you have to analyze a particular so ...

  6. POJ 2299 Ultra-QuickSort(树状数组 + 离散)

    链接:http://poj.org/problem?id=2299 题意:给出N个数组成的数列A(0 <= A[i] <= 999,999,999),求该数列逆序对的数量. 分析:题目所谓 ...

  7. zoj 2386 || poj 2299 Ultra-QuickSort

    我晕 ,这个我没有写题解么..忘了.. 求逆序数... 白皮书上有,用的归并排序,今天又看了算导的归并排序,写了下,过了. 因为这个题在树状数组的分类下的,所以尝试用树状数组做.想了会... 因为数的 ...

  8. POJ 2299 Ultra-QuickSort(树状数组+离散化)

    题目大意: 就是说,给你一个序列,然后让你求出这个序列有多少个逆序对,所谓逆序对就是对于这个序列中的元素有a[i]>a[j] 且i<j存在. 其实原题是这样说的,给你一个序列,让你用最少的 ...

  9. POJ 2299 - Ultra-QuickSort BIT

    题意 给我们一个序列 序列长度小于500000 每个元素 小于999999999 让我们只移动相邻的元素 最终使得他们移动到正好上升序的最小移动次数 分析 我们看 最小的移动次数其实是个幌子 因为你移 ...

最新文章

  1. [Eclipse]GEF入门系列(六、添加菜单和工具条)
  2. sixth week:third work
  3. 我自己为我自己定制的文章模板
  4. please wait while windows configures microsoft visual studio professional 2013
  5. 蓟门边studio-码农创业路的起点
  6. SQL Server如何链接到 Oracle并查询其中的数据?并实现做接口
  7. 文件共享存储主备实时热备实现方案
  8. Spring Cloud与微服务学习总结(5)——认证鉴权与API权限控制在微服务架构中的设计与实现(三)
  9. More Effective C++精简版(4)
  10. 《OpenGL编程指南》收藏的学习网址
  11. 夹水晶头8根网线的顺序
  12. html5 放风筝,北京最全的放风筝5大最佳地点,地广人稀,不用花钱
  13. mysql命令行备份数据库
  14. Unity Navigation烘焙路面与自动寻路
  15. 以“空城计”为例的项目管理执行方法论干货
  16. linux释放cpu命令,linux内存清理和释放命令
  17. R语言系列学习(各种检验)
  18. 七夕恋人必备表白源码
  19. 【通信】盖氏圆盘方法(GDE)计算均匀直线阵(ULA)中信号源个数附matlab代码
  20. 基于soap 的 python web services 服务开发指南

热门文章

  1. 理财平台频繁暴雷,羊毛党该要本金还是撸利息?
  2. 一个人到底申请几张信用卡最合适?
  3. 安卓PopupWindow
  4. 使用vivado进行逻辑开发时,进行到Generate Bitstream时报错
  5. Java字节码反编译工具
  6. leetcode跳跃游戏C语言,LeetCode:跳跃游戏
  7. 取pi的前8位的解压密码_两种方式实现取16位变量的高低8位, 不严谨对比
  8. docker always_Ubuntu+Docker+STF环境搭建
  9. java设置属性的取值范围是多少_jvm-Java系统属性的范围
  10. Tensor数据相关的运算、函数讲解及与numpy区别