HDU-1425-sort(计数排序以及快速排序和堆排序的变种)
- 计数排序
Accepted 1425 483MS 5276K 997 B G++ #include "bits/stdc++.h"
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + ;
const int MIN_NUM = -5e5;
const int MAX_NUM = 5e5;
// MAX_NUM - MIN_NUM 表示输入数字的范围
int num[MAX_NUM - MIN_NUM + ];
int main() {
int n, m, k;
while (~scanf("%d%d", &n, &m)) {
while (n--) {
scanf("%d", &k);
// 因为存在负数而没有负下标,所以将所有输入的数减去MIN_NUM然后再存入对应下标
num[k - MIN_NUM]++;
}
k = MAX_NUM - MIN_NUM;
while (m--) {
while (num[k] == ) {
k--;
}
num[k]--;
if (m != ) {
printf("%d ", k + MIN_NUM);
} else {
printf("%d\n", k + MIN_NUM);
}
}
// k后面的都已经清空了所以,这里只要清空k前面这段就好了;
memset(num, , sizeof(int) * (k + ));
}
return ;
}计数排序适用于排序范围已知且排序数量大,排序范围小的情况。复杂度为Ο(n+k)。n表示排序数量,k表示排序范围;计数排序还有个优点在于不用记录原数,所有只要排序范围比较小是比较省空间的;
- 堆排序变种
Accepted 1425 499MS 2156K 1290 B G++ #include "bits/stdc++.h"
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + ;
int arr[MAXN];
int n, m, k;
void minHeapFix (int id) {
int mn = id << ;
if (mn > m) {
return;
}
if (mn < m && arr[mn | ] < arr[mn]) {
mn |= ;
}
if (arr[mn] < arr[id]) {
swap(arr[mn], arr[id]);
minHeapFix(mn);
}
}
int main() {
while (~scanf("%d%d", &n, &m)) {
// 因为题目要求前m大,所以这里的堆只维护前m大的数
for (int i = ; i <= m; i++) {
scanf("%d", &arr[i]);
}
for (int i = m >> ; i; i--) {
minHeapFix(i);
}
for (int i = m + ; i <= n; i++) {
scanf("%d", &k);
// 这里维护的是小顶堆,堆顶最小,如果k比前m大中最小的数要大,用k替换堆顶,再维护小顶堆
if (k > arr[]) {
arr[] = k;
minHeapFix();
}
}
k = m;
for (int i = ; i < k; i++) {
swap(arr[], arr[m--]);
minHeapFix();
}
for (int i = ; i < k; i++) {
printf("%d ", arr[i]);
}
printf("%d\n", arr[k]);
}
return ;
}这题用堆排好在于他不用维护n个数只要维护前m大的数就够了,但是题目中说(0<n,m<1000000)可见m也不小了,所以比计排还要慢些,如果m比较小还是很快的。
- 快速排序变种
Accepted 1425 468MS 3332K 1460 B G++ #include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + ;
int arr[MAXN];
int n, m;
void quickSort(int l, int r) {
if (l >= r) {
return;
}
int mid = l + r >> , id;
if (arr[l] <= arr[mid] && arr[l] <= arr[r]) {
id = arr[mid] <= arr[r] ? mid : r;
} else {
if (arr[mid] <= arr[r]) {
id = arr[l] <= arr[r] ? l : r;
} else {
id = arr[l] <= arr[mid] ? l : mid;
}
}
swap(arr[l], arr[id]);
int ge = l + , lt = r;
while (ge < lt) {
if (arr[ge] >= arr[l]) {
ge++;
} else if (arr[lt] >= arr[l]){
swap(arr[ge], arr[lt]);
ge++;
lt--;
} else {
while (arr[lt] < arr[l] && ge < lt) {
lt--;
}
}
}
if (arr[ge] < arr[l]) {
ge--;
}
swap(arr[ge], arr[l]);
quickSort(l, ge - );
// 变种就变在这个if, 因为只要前m大的数有序,所以当ge >= m时就不用排后面的数了
if (ge < m) {
quickSort(ge + , r);
}
}
int main() {
while (~scanf("%d%d", &n, &m)) {
for (int i = ; i <= n; i++) {
scanf("%d", &arr[i]);
}
quickSort(, n);
for (int i = ; i < m; i++) {
printf("%d ", arr[i]);
}
printf("%d\n", arr[m]);
}
return ;
} - 快速排序再变种
Accepted 1425 468MS 3332K 1264 B G++ #include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + ;
int arr[MAXN];
int n, m;
void quickSort(int l, int r, int mn, int mx) {
if (l >= r || mn >= mx) {
return;
}
// 取排序范围的中值作为mid
int mid = mn + mx >> ;
/*
下面的if很重要,原先没加导致
5 5
1 2 3 4 5
这组数据死循环。
*/
if (mid == mn) {
mid++;
}
int ge = l, lt = r;
while (ge < lt) {
if (arr[ge] >= mid) {
ge++;
} else if (arr[lt] >= mid){
swap(arr[ge], arr[lt]);
ge++;
lt--;
} else {
while (arr[lt] < mid && ge < lt) {
lt--;
}
}
}
if (arr[ge] < mid) {
ge--;
}
quickSort(l, ge, mid, mx);
if (ge < m) {
quickSort(ge + , r, mn, mid - );
}
}
int main() {
while (~scanf("%d%d", &n, &m)) {
for (int i = ; i <= n; i++) {
scanf("%d", &arr[i]);
}
quickSort(, n, -5e5, 5e5);
for (int i = ; i < m; i++) {
printf("%d ", arr[i]);
}
printf("%d\n", arr[m]);
}
return ;
}一般的快排都会采用三点取中法来找mid,但是这个mid并不是数组真正的中位数,所以这里采用数据范围的中值作为mid。本来以为会快一点的,但是好像和上面的快排差不多,看样子三点取中法还是很靠谱的。另外写二分一定注意死循环,快被二分死循环搞疯了。
HDU-1425-sort(计数排序以及快速排序和堆排序的变种)的更多相关文章
- hdu 1425:sort(排序,经典题。快排模板)
sort Time Limit : 6000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissi ...
- HDU 1425 sort C语言实现快速排序
AC代码:sort Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- counting sort 计数排序
//counting sort 计数排序 //参考算法导论8.2节 #include<cstdio> #include<cstring> #include<algorit ...
- sort(hdu oj 1425)计数排序和快速排序
Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0 < n,m < 1000000),第二行包含n个各不 ...
- 『ACM C++』HDU杭电OJ | 1425 - sort (排序函数的特殊应用)
今天真的是累哭了,周一课从早八点半一直上到晚九点半,整个人要虚脱的感觉,因为时间不太够鸭所以就回头看看找了一些比较有知识点的题来总结总结分析一下,明天有空了就开始继续打题,嘻嘻嘻. 今日兴趣电影: & ...
- E题hdu 1425 sort
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425 sort Time Limit: 6000/1000 MS (Java/Others) M ...
- Uva-------(11462) Age Sort(计数排序)
B Age Sort Input: Standard Input Output: Standard Output You are given the ages (in years) of all ...
- hdu 1425 sort 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425 常规的方法是对输入的数从大到小进行排序(可以用sort或qsort),然后输出前m大的数. 不过 ...
- HDU 1425 sort hash+加速输入
http://acm.hdu.edu.cn/showproblem.php?pid=1425 题目大意: 给你n个整数,请按从大到小的顺序输出其中前m大的数. 其中n和m都是位于[-500000,50 ...
随机推荐
- Python说文解字_杂谈01
1. Python在Ubuntu下面下载Python 2. 安装依赖包 sudo apt-get update sudo apt-get install build-essential python- ...
- 计蒜客 数独(DFS)
蒜头君今天突然开始还念童年了,想回忆回忆童年.他记得自己小时候,有一个很火的游戏叫做数独.便开始来了一局紧张而又刺激的高阶数独.蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答 ...
- SSM到Spring Boot-校园商铺平台
第04章 店铺注册功能模块 4-3 Thumbnailator图片处理和封装Util[通过java代码实现给图片打上水印] 4-3 Thumbnailator图片处理和封装Util[通过java代码实 ...
- python编程:从入门到实践----基础知识>第4章练习
4-1 比萨 :想出至少三种你喜欢的比萨,将其名称存储在一个列表中,再使用for 循环将每种比萨的名称都打印出来. a.修改这个for 循环,使其打印包含比萨名称的句子,而不仅仅是比萨的名称.对于每种 ...
- 创建Git仓库
创建Git仓库 一.什么是版本仓库 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能 ...
- Linux分区挂载
Liunx采用树形的文件管理系统,也就是在Linux系统中,可以说已经没有分区的概念了.分区在Linux和其他设备一样都只是一个文件.要使用一个分区必须把它加载到文件系统中.这可能难于理解,继续往下看 ...
- pyinstaller 3.6版本通过pip安装失败的解决办法
本机中原pyinstaller版本为3.5版本,本打算通过 pip install --upgrade pyinstaller进行升级,竟然报错,后面卸载再重新安装也一样报错,没办法看来通过pip是暂 ...
- Opencv笔记(十二)——形态学转换
学习目标: 学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等 我们要学习的函数有: cv2.erode(), cv2.dilate(), cv2.morphologyEx()等 原理简介: 形态 ...
- C++ for循环遍历几种写法
最近写for循环,发现以前用过的方法都忘记了,这里整理下几种方法,欢迎大佬补充: 1. for(itnt n =1;n<5;n++) { } 2. for (auto it = list.beg ...
- js之意想不到的结果
js 是弱类型语言 ,在进行计算时 如果遇到不能计算的单位,就会进行默认转换 1.typeof NaN 结果为 “number” 原因:NaN 表示 不是不是一个数字(Not a Number), ...