超级快排:Ultra-QuickSort
超级快排: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相关推荐
- 使用Java泛型实现快速排序(快排,Quicksort)
原文:https://my.oschina.net/u/1382972/blog/169747 还可以参考:http://blog.csdn.net/stushan/article/details/5 ...
- 超级哇塞的快排,你值得学会!
今天我们要讲的是快速排序,非常的哇塞! 简单了解一下快排------ 下面介绍快排的三个方法,未优化和优化后的快排 First----hoare版本 也就是说先确立的一个下标为key的值为对比值,普遍 ...
- 选择第K大元素(快排、快选以及k-选取比较)
选择第K大元素(快排.快选以及k-选取比较) 问题:编写一段程序,随机生成10^4, 10^5, 10^6个随机数,并分别在这三者中,分别使用快排和linearSelect()方法,选择出第100大的 ...
- 在php中冒泡排序,php中实现快排与冒泡排序
快排 function quicksort($str){ if(count($str)<=1) return $str;//如果个数不大于一,直接返回 $key=$str[0];//取一个值,稍 ...
- 快排(动图详细版,快速理解)
注:本文主要介绍六大排序中的快排 文章目录 前言 一.三大法则 1.1 Hoare法 1.2 挖坑法 1.3 双指针法(更加便捷) 1.4 三种方法时间复杂度计算 二.快排栈问题优化方式 2.1 三数 ...
- python实现快排算法(quicksort)
python实现快排算法(quicksort) 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后 ...
- 快速排序(快排)--->注释超详细
基本思想: 1.先选取一个基准值(一般选取数组第一个元素). 2.以第一步选取的基准值为标准,然后从最后一个数值开始一步步向前走将数字与基准值进行比较,如果该值大于基准 ...
- java快排算法解读,java 快排的思路与算法
java 快排的思路与算法 有时候面试的时候的会问道Arrays.sort()是怎么实现的,我以前根本不知道是什么东西,最近点进去看了一下.直接吓傻, //看到这个时候还是比较淡定的,可怕的事情来了. ...
- java 快排_八大排序-快速排序(搞定面试之手写快排)
概要 快速排序由C. A. R. Hoare在1960年提出,是八大排序算法中最常用的经典排序算法之一.其广泛应用的主要原因是高效,核心算法思想是分而治之.快速排序经常会被作为面试题进行考察,通常的考 ...
最新文章
- jupyter扩展插件Nbextensions的安装、使用
- 1-VMware workstation认识
- CTFshow 反序列化 web263
- 王道计算机考研 数据结构 (查找-下)
- CVPR 2019 | 实体零售场景下密集商品的精确探测
- 重新想象 Windows 8 Store Apps (52) - 绑定: 与 Element Model Indexer Style RelativeSource 绑定, 以及绑定中的数据转换...
- Servlet使用适配器模式进行增删改查案例(IDeptDao.java和IEmpDao.java)
- principle中文_principle与principal,长得像,发音还一样!又头疼了!
- CocosCreator简单小鸟穿越隧道小游戏
- 硬件工程师面试基础知识点
- 【Oracle】IF EXISTS用法
- 浅谈YOLOV2与YOLOV3
- CCNA题库第一部分
- win10 安装程序显示“为了对电脑进行保护,已经阻止此应用” 管理员已阻止你运行此应用
- PS:如何使用PS制作好看的文字图片,以CSDN分类专栏图标为例
- 蓝绿红黑灰|常用的发布方式
- 华为云照片的爬虫程序更新(python3.6)
- mysql主键有Duplicate entry
- C# %253A%252F%252F 咋编码
- Android LRUCache原理
热门文章
- SN74LVC4245APWR/74LVC4245APW/AIP74LVC4245最新中文资料
- **史上最全的倾斜测量/实景三维应用汇总**
- DEM_ASTGTMV003_N30E107_num.tif 数据质量文件说明
- java福利游戏_《我的世界中国版》PC Java版开测 家族盛典福利不断
- 2022-2028年中国锂资源行业市场运营格局及未来前景分析报告
- MOOC数据结构(下)(自主模式)-平均气温(Temperature)
- 超级计算机使用机时,使用天河二号超级计算机资源申请表(10页).doc
- 前大灯是近光灯还是远光灯_近光灯和远光灯的区别 如何正确的使用汽车的灯光...
- 2014秋江苏计算机二级,2014年秋季江苏省计算机等级考试扣费通知
- Qt Creator编译报错: C2001: 常量中有换行符