超级快排:Ultra-QuickSort

总时间限制: 

7000ms

内存限制: 

65536kB

描述

在这个问题中,你需要分析特别的算法。这个算法通过对一个包含n个元素的进行操作,一直交换相邻的两个序列的元素直到整个序列呈升序排列。对于输入序列9 1 0 5 4 ,Ultra-QuickSort最终得到的输出为0 1 4 5 9 .你的任务就是来计算出Ultra-QuickSort 至少需要多少swap操作来最终达到对一个给定的输入序列排好序的目标。

输入

输入包括多组测试数据。每组测试数据以一行包括一个单独的整数n开始(n<500,000,是输入序列的长度)。每组测试数据接下来的n行包括一个单独的整数a[i],a[i]≤ 999,999,999,代表输入序列第n个元素。输入以一个长度n为0的序列终止。这个序列不应该被处理。

输出

对于每组测试数据,你的程序应该输入单独的一行,包括一个整数op,代表对该输入序列进行排序所需要最小的交换次数。

样例输入

5
9
1
0
5
4
3
1
2
3
0

样例输出

6
0

思路:

最开始:

刚开始看到这道题的时候,我就觉得很简单啊,不就是求逆序对吗,于是,我写了一个特殊的bubble(就是冒泡排序,因为要计数,所以不能用STL库里面的sort),果然,超时了!(因为超时过于严重,所以就不发图片了)

中间:

因为冒泡排序都已经严重超时了,我就想到了快速排序,因为STL库中的qsort快速排序函数不符合题目要求,就只能自己手写一个,我一下就码出来了:

#include<bits/stdc++.h>
using namespace std;
int n,a[20005],tmp[20005];
int sum;
inline void swap(int x,int y) {int tmp=a[x];a[x]=a[y];a[y]=tmp;
}
void qsort(int l,int r){if(l>=r) return;int mid=(l+r)/2;qsort(l,mid);qsort(mid+1,r);int p1=l,p2=mid+1,i=l;while(p1<=mid&&p2<=r){if(a[p1]<=a[p2])tmp[i++]=a[p1++];else if(a[p2]<a[p1]){tmp[i++]=a[p2++];sum+=mid-p1+1;}}while(p2<=r)tmp[i++]=a[p2++];while(p1<=mid)tmp[i++]=a[p1++];for(int i=l;i<=r;i++) a[i]=tmp[i];
}
void init(){while(scanf("%d",&n)!=EOF&&n){sum=0;for(int i=1;i<=n;i++)scanf("%d",&a[i]);qsort(1,n);printf("%d\n",sum);}
}
int main(){init();return 0;
}

经过提交之后,emm……(又超时了)

都已经用了快速排序了,竟然还会超时?于是我决定用归并排序和桶排序了。

我决定先用归并排序(因为我那时候还没有想好怎样用桶排序),在归并排序的函数中,没执行一次判断,就将ans(计数的)进行加(j-k)。

归并排序代码:

#include<stdio.h>
const int MAXN=500010;
int a[MAXN],b[MAXN];
long long ans;
void mergesort(int start,int mid,int end){int i=start,k=start,j=mid+1;while(i<=mid&&j<=end){if(a[i]<=a[j])b[k++]=a[i++];else{ans+=j-k;b[k++]=a[j++];}}while(i<=mid)b[k++]=a[i++];while(j<=end)b[k++]=a[j++];for(int i=start;i<=end;i++)a[i]=b[i];
}
void ms(int l,int r){if(l<r){int mid=(l+r)/2;ms(l,mid);ms(mid+1,r);mergesort(l,mid,r);}
}
int main(){int n;while(scanf("%d",&n),n){ans=0;for(int i=1;i<=n;i++)scanf("%d",a+i);ms(1,n);printf("%lld\n",ans);}return 0;
}

经过这次归并排序后,提交以后我终于AC了。

这就是今天的排序题目,大家再见!

题目链接:

OpenJudge - 7:Ultra-QuickSorthttp://dsalgo.openjudge.cn/sort/7/

超级快排:Ultra-QuickSort相关推荐

  1. 使用Java泛型实现快速排序(快排,Quicksort)

    原文:https://my.oschina.net/u/1382972/blog/169747 还可以参考:http://blog.csdn.net/stushan/article/details/5 ...

  2. 超级哇塞的快排,你值得学会!

    今天我们要讲的是快速排序,非常的哇塞! 简单了解一下快排------ 下面介绍快排的三个方法,未优化和优化后的快排 First----hoare版本 也就是说先确立的一个下标为key的值为对比值,普遍 ...

  3. 选择第K大元素(快排、快选以及k-选取比较)

    选择第K大元素(快排.快选以及k-选取比较) 问题:编写一段程序,随机生成10^4, 10^5, 10^6个随机数,并分别在这三者中,分别使用快排和linearSelect()方法,选择出第100大的 ...

  4. 在php中冒泡排序,php中实现快排与冒泡排序

    快排 function quicksort($str){ if(count($str)<=1) return $str;//如果个数不大于一,直接返回 $key=$str[0];//取一个值,稍 ...

  5. 快排(动图详细版,快速理解)

    注:本文主要介绍六大排序中的快排 文章目录 前言 一.三大法则 1.1 Hoare法 1.2 挖坑法 1.3 双指针法(更加便捷) 1.4 三种方法时间复杂度计算 二.快排栈问题优化方式 2.1 三数 ...

  6. python实现快排算法(quicksort)

    python实现快排算法(quicksort) 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后 ...

  7. 快速排序(快排)--->注释超详细

    基本思想:         1.先选取一个基准值(一般选取数组第一个元素).         2.以第一步选取的基准值为标准,然后从最后一个数值开始一步步向前走将数字与基准值进行比较,如果该值大于基准 ...

  8. java快排算法解读,java 快排的思路与算法

    java 快排的思路与算法 有时候面试的时候的会问道Arrays.sort()是怎么实现的,我以前根本不知道是什么东西,最近点进去看了一下.直接吓傻, //看到这个时候还是比较淡定的,可怕的事情来了. ...

  9. java 快排_八大排序-快速排序(搞定面试之手写快排)

    概要 快速排序由C. A. R. Hoare在1960年提出,是八大排序算法中最常用的经典排序算法之一.其广泛应用的主要原因是高效,核心算法思想是分而治之.快速排序经常会被作为面试题进行考察,通常的考 ...

最新文章

  1. jupyter扩展插件Nbextensions的安装、使用
  2. 1-VMware workstation认识
  3. CTFshow 反序列化 web263
  4. 王道计算机考研 数据结构 (查找-下)
  5. CVPR 2019 | 实体零售场景下密集商品的精确探测
  6. 重新想象 Windows 8 Store Apps (52) - 绑定: 与 Element Model Indexer Style RelativeSource 绑定, 以及绑定中的数据转换...
  7. Servlet使用适配器模式进行增删改查案例(IDeptDao.java和IEmpDao.java)
  8. principle中文_principle与principal,长得像,发音还一样!又头疼了!
  9. CocosCreator简单小鸟穿越隧道小游戏
  10. 硬件工程师面试基础知识点
  11. 【Oracle】IF EXISTS用法
  12. 浅谈YOLOV2与YOLOV3
  13. CCNA题库第一部分
  14. win10 安装程序显示“为了对电脑进行保护,已经阻止此应用” 管理员已阻止你运行此应用
  15. PS:如何使用PS制作好看的文字图片,以CSDN分类专栏图标为例
  16. 蓝绿红黑灰|常用的发布方式
  17. 华为云照片的爬虫程序更新(python3.6)
  18. mysql主键有Duplicate entry
  19. C# %253A%252F%252F 咋编码
  20. Android LRUCache原理

热门文章

  1. SN74LVC4245APWR/74LVC4245APW/AIP74LVC4245最新中文资料
  2. **史上最全的倾斜测量/实景三维应用汇总**
  3. DEM_ASTGTMV003_N30E107_num.tif 数据质量文件说明
  4. java福利游戏_《我的世界中国版》PC Java版开测 家族盛典福利不断
  5. 2022-2028年中国锂资源行业市场运营格局及未来前景分析报告
  6. MOOC数据结构(下)(自主模式)-平均气温(Temperature)
  7. 超级计算机使用机时,使用天河二号超级计算机资源申请表(10页).doc
  8. 前大灯是近光灯还是远光灯_近光灯和远光灯的区别 如何正确的使用汽车的灯光...
  9. 2014秋江苏计算机二级,2014年秋季江苏省计算机等级考试扣费通知
  10. Qt Creator编译报错: C2001: 常量中有换行符