sort 快排解决百万级的排序
问题:给n个整数,按从大到小的顺序,输出前m大的整数
0<m,n<1000000,每个整数[-500000,500000]
输入:
5 3
3 -35 92 213 -644
输出:
213 92 3
思路:
先按从小到大用快排排好序,然后输出排好序的数组从最后开始输出m个即可
关键:
1 已经达到千万数量级,1秒不能解决,必须用哈希,因为数字的范围达到百万级
2 哈希针对的是输入数值处于特定范围的问题,建立一个范围大小的数组,建立hash[x] = x出现多少次的映射
3 对于定义较大容量的数组,放在函数体外,这样用全局变量,内存会比较充足
4 对于区间为负的,需要设定下标补偿值
哈希排序就是桶排序:https://www.cnblogs.com/helloworld2019/p/10353265.html
快排就能解决问题:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 1000050
int a[N];//当数据过大时要放在函数外面防止栈溢出
int m;
void QuickSort(int low,int high){
int k;
int i;
k=a[low];
int left=low;
int right=high;
if(left>right)
return ;
while(left!=right){
while(a[right]<k&&left<right)
right--;
if(left<right){
a[left]=a[right];
left++;
}
while(a[left]>k&&left<right)
left++;
if(left<right){
a[right]=a[left];
right--;
}
}
a[left]=k;
if(m<=left+) QuickSort(low,left-);
else{
QuickSort(low,left-);
QuickSort(left+,high);
}
}
int main(){
int i;
int j;
int n;
while(scanf("%d%d",&n,&m)!=EOF){
for(i=;i<n;i++)
scanf("%d",&a[i]);
QuickSort(,n-);
for(i=;i<m;i++){
printf("%d",a[i]);
if(i!=m-)
printf(" ");//注意最后没有空格
}
printf("\n");//每组数据输出一行
}
return ;
}
sort 快排解决百万级的排序的更多相关文章
- Quick Sort(快排)
这是挖坑填补法的演示 快排之挖坑填补法: void Quick(int top/*起始位置*/,int end/*末尾位置*/,int arr[])//挖坑填补法 { int i=top,j=end, ...
- HDU1425 <sort 快排>
给你n个整数,请按从大到小的顺序输出其中前m大的数. 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,5000 ...
- Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)
一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...
- 排序基础之归并排序、快排、堆排序、希尔排序思路讲解与Java代码实现
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6594855.html 一:归并排序==通过中间值进行左右划分递归,然后调用合并函数对左右递归的结果进行合并( ...
- 函数模拟sort快排
设计一个对一维数组进行排序的sort函数,并调用它实现数组排序 思路:函数调用不止调用一个,最主要对函数不熟悉: #include<stdio.h> #define N 10 int ma ...
- 快排,归并和Shell排序
快速排序 快速排序的执行流程: (1) 先从数列中取出一个数作为基准数. (2) 将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. (3)再对左右区间重复第二步,直到各区间只有一个数. ...
- 普林斯顿大学算法课 Algorithm Part I Week 3 重复元素排序 - 三路快排 Duplicate Keys
很多时候排序是为了对数据进行归类,这种排序重复值特别多 通过年龄统计人口 删除邮件列表里的重复邮件 通过大学对求职者进行排序 若使用普通的快排对重复数据进行排序,会造成N^2复杂度,但是归并排序和三路 ...
- 总结:如何使用redis缓存加索引处理数据库百万级并发
前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据, ...
- 使用redis缓存加索引处理数据库百万级并发
使用redis缓存加索引处理数据库百万级并发 前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1 ...
随机推荐
- Could not update the distribution database subscription table. The subscription status could not be changed.
在一个测试服务器删除发布(Publication)时遇到下面错误,具体如下所示 标题: Microsoft SQL Server Management Studio --------------- ...
- A problem has been detected and windows has been shut down to prevent damage to your computer.他么啥意思?看这里!【蓝屏】
A problem has been detected and windows has been shut down to prevent damage to your computer. 检测到问 ...
- SQL Server 锁实验(INSERT加锁探究)
insert语句: 其上锁情况为: insert语句会对表上的所有索引作出更新,因此这里看到的索引列较多,我们先把所有的索引搞出来看看: 可以看到所有索引都涉及到了,然后我们来仔细分析下加锁情况: 1 ...
- Windows Server 2016-管理站点复制(二)
为了保持所有域控制器上的目录数据一致和最新,Active Directory 会定期复制目录更改.复制根据标准网络协议进行,并使用更改跟踪信息防止发生不必要的复制,以及使用链接值复制以提高效率. 本章 ...
- 对Can We MakeOperating SystemsReliable and Secure 的翻译
摘要:微内核-相对于大内核(monolithic kernels)来说,由于它的 lower performance,长期以来被认为是不可接受的.而现在,由于它潜 在的高可靠性(higher reli ...
- JavaScript -- 时光流逝(九):Window 对象、Navigator 对象
JavaScript -- 知识点回顾篇(九):Window 对象.Navigator 对象 1. Window 对象 1.1 Window 对象的属性 (1) closed: 返回窗口是否已被关闭. ...
- 注入攻击(SQL注入防御)
正确的防御SQL注入 sql注入的防御不是简单只做一些用户输入的escape处理,这样是不够的,只是提高了攻击者的门槛而已,还是不够安全. 例如 mysql_real_escape_string()函 ...
- adb install与pm install 区别
“adb install xx.apk”= “adb push xx.apk /data/local/tmp”+“pm install /data/local/tmp/xx.apk”. “adb in ...
- nginx tcp负载均衡 (Module ngx_stream_upstream_module)
Example ConfigurationDirectives upstream server zone state hash least_conn ...
- 近日使用Taro框架的一点小心得
1.yarn npm安装的包,跟权限问题有关,与网络也有关 2.Vue框架首先,是解决了view-model的问题,解放开发的双手,使得显示和数据和控制分开 3.当你觉得最近没有技术文章看时,就看收藏 ...