HDU 1425 sort(堆排序/快排/最大堆/最小堆)
Description
Input
Output
Sample Input
5 3 3 -35 92 213 -644
Sample Output
213 92 3
1、使用内建sort函数
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int ans[1000001];
int main()
{
int n,m;
while (scanf("%d%d",&n,&m) != EOF)
{
for (int i = 0;i < n;i++)
{
scanf("%d",&ans[i]);
}
sort(ans,ans + n);
printf("%d",ans[n - 1]);
for(int i = n - 2;m > 1;m--,i--)
{
printf(" %d",ans[i]);
}
printf("\n");
}
return 0;
}
2、使用内建优先队列
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
int main()
{
int N,M;
while (~scanf("%d%d",&N,&M))
{
priority_queue<int>que;
bool first = true;
int tmp;
while (N--)
{
scanf("%d",&tmp);
que.push(tmp);
}
while (M--)
{
first?printf("%d",que.top()):printf(" %d",que.top());
que.pop();
first = false;
}
printf("\n");
}
return 0;
}
3、使用内部堆函数
#include <cstdio>
#include <algorithm>
using namespace std;
static int a[1000000];
int main()
{
int i,n,m;
while(EOF != scanf("%d %d",&n,&m))
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
make_heap(a,a+n);
printf("%d",a[0]);
for(i=1;i<m;i++)
{
pop_heap(a,a+n-i+1);
printf(" %d",a[0]);
}
printf("\n");
}
return 0;
}
4、手写最大堆
#include<stdio.h>
#include<string.h>
const int maxn = 1000005;
int heap[maxn],sz = 0;
void push(int x)
{
int i = sz++;
while (i > 0)
{
int p = (i - 1)/2;
if (heap[p] >= x) break;
heap[i] = heap[p];
i = p;
}
heap[i] = x;
}
int pop()
{
int ret = heap[0];
int x = heap[--sz];
int i = 0;
while (i*2+1<sz)
{
int a = i*2+1,b = i*2+2;
if (b < sz && heap[b]>heap[a]) a = b;
if (heap[a] <= x) break;
heap[i] = heap[a];
i = a;
}
heap[i] = x;
return ret;
}
int main()
{
int n,m,tmp;
while (~scanf("%d%d",&n,&m))
{
sz = 0;
memset(heap,0,sizeof(heap));
for (int i = 0;i < n;i++) scanf("%d",&tmp),push(tmp);
for (int i = 1;i < m;i++) printf("%d ",pop());
printf("%d\n",pop());
}
return 0;
}
5、手写堆排序(从大到小)
#include<bits/stdc++.h>
using namespace std;
#define LeftChild(i) (2*(i)+1)
const int maxn = 1000005;
int a[maxn];
void PercDown(int a[],int i,int N)
{
int Child;
int tmp;
for (tmp = a[i];LeftChild(i) <N;i = Child)
{
Child = LeftChild(i);
if (Child != N - 1 && a[Child+1] < a[Child])
Child++;
if (tmp > a[Child])
a[i] = a[Child];
else
break;
}
a[i] = tmp;
}
void Heapsort(int a[],int N)
{
int i;
for (i = N/2;i >= 0;i--)
PercDown(a,i,N);
for (i = N-1;i > 0;i--)
{
swap(a[0],a[i]);
PercDown(a,0,i);
}
}
int main()
{
int n,m;
while (~scanf("%d%d",&n,&m))
{
for (int i = 0;i < n;i++) scanf("%d",&a[i]);
Heapsort(a,n);
printf("%d",a[0]);
for (int i = 1;i < m;i++) printf(" %d",a[i]);
printf("\n");
}
return 0;
}
6、手写堆排序(从小到大)
#include<cstdio>
#include<algorithm>
using namespace std;
#define LeftChild(i) (2*(i)+1)
const int maxn = 1000005;
int a[maxn];
void PercDown(int a[],int i,int N)
{
int Child;
int tmp;
for (tmp = a[i];LeftChild(i) <N;i = Child)
{
Child = LeftChild(i);
if (Child != N - 1 && a[Child+1] > a[Child])
Child++;
if (tmp < a[Child])
a[i] = a[Child];
else
break;
}
a[i] = tmp;
}
void Heapsort(int a[],int N)
{
int i;
for (i = N/2;i >= 0;i--)
PercDown(a,i,N);
for (i = N-1;i > 0;i--)
{
swap(a[0],a[i]);
PercDown(a,0,i);
}
}
int main()
{
int n,m;
while (~scanf("%d%d",&n,&m))
{
for (int i = 0;i < n;i++) scanf("%d",&a[i]);
Heapsort(a,n);
printf("%d",a[n-1]);
for (int i = n-2;i > n-1 - m;i--) printf(" %d",a[i]);
printf("\n");
}
return 0;
}
7、手写快速排序(从大到小)
#include<bits/stdc++.h>
using namespace std;
#define Cutoff (3)
const int maxn = 1000005;
int a[maxn];
void InsertionSort(int a[],int N)
{
int i,j,tmp;
for (i = N - 2;i >= 0;i--)
{
tmp = a[i];
for (j = i;j < N - 1 && a[j + 1] > tmp;j++)
a[j] = a[j + 1];
a[j] = tmp;
}
}
int median3(int a[],int left,int right)
{
int center = (left + right) / 2;
if (a[left] < a[center])
swap(a[left],a[center]);
if (a[left] < a[right])
swap(a[left],a[right]);
if (a[center] < a[right])
swap(a[center],a[right]);
swap(a[center],a[left + 1]);
return a[left + 1];
}
void qsort(int a[],int left,int right)
{
int i,j,pivot;
if (left + Cutoff <= right)
{
pivot = median3(a,left,right);
i = left + 1;j = right;
for (;;)
{
while (a[++i] > pivot){}
while (a[--j] < pivot){}
if (i < j) swap(a[i],a[j]);
else break;
}
swap(a[j],a[left + 1]);
qsort(a,left,j - 1);
qsort(a,j + 1,right);
}
else InsertionSort(a + left,right - left + 1);
}
int main()
{
int n,m;
while (~scanf("%d%d",&n,&m))
{
for (int i = 0;i < n;i++) scanf("%d",&a[i]);
qsort(a,0,n - 1);
printf("%d",a[0]);
for (int i = 1;i < m;i++) printf(" %d",a[i]);
printf("\n");
}
return 0;
}
8、手写快速排序(从小到大)
#include<bits/stdc++.h>
using namespace std;
const int Cutoff = 10;
const int maxn = 1000005;
int a[maxn];
void InsertionSort(int a[],int N)
{
int i,j,tmp;
for (i = 1;i < N;i++)
{
tmp = a[i];
for (j = i;j > 0 && a[j - 1] > tmp;j--)
a[j] = a[j - 1];
a[j] = tmp;
}
}
int median3(int a[],int left,int right)
{
int center = (left + right) / 2;
if (a[left] > a[center])
swap(a[left],a[center]);
if (a[left] > a[right])
swap(a[left],a[right]);
if (a[center] > a[right])
swap(a[center],a[right]);
swap(a[center],a[right-1]);
return a[right-1];
}
void qsort(int a[],int left,int right)
{
int i,j,pivot;
if (left + Cutoff <= right)
{
pivot = median3(a,left,right);
i = left;j = right-1;
for (;;)
{
while (a[++i] < pivot){}
while (a[--j] > pivot){}
if (i < j) swap(a[i],a[j]);
else break;
}
swap(a[i],a[right-1]);
qsort(a,left,i - 1);
qsort(a,i + 1,right);
}
else InsertionSort(a + left,right - left + 1);
}
int main()
{
int n,m;
while (~scanf("%d%d",&n,&m))
{
for (int i = 0;i < n;i++) scanf("%d",&a[i]);
qsort(a,0,n - 1);
printf("%d",a[n - 1]);
for (int i = n - 2;i > n - m - 1;i--) printf(" %d",a[i]);
printf("\n");
}
return 0;
}
HDU 1425 sort(堆排序/快排/最大堆/最小堆)的更多相关文章
- 最大堆 最小堆 解决TOPK问题
堆:实质是一颗完全二叉树,最大堆的特点:父节点值均大于子节点:最小堆的父节点值均小于子节点: 一般使用连续内存存储堆内的值,因而可以根据当前节点的索引值推断子节点的索引值: 节点i的父节点为(i-1) ...
- hdu 1425:sort(排序,经典题。快排模板)
sort Time Limit : 6000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissi ...
- E题hdu 1425 sort
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425 sort Time Limit: 6000/1000 MS (Java/Others) M ...
- Black Box--[优先队列 、最大堆最小堆的应用]
Description Our Black Box represents a primitive database. It can save an integer array and has a sp ...
- 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 ...
- HDU 1425 sort 【哈希入门】
题意:给出n个数,输出前m大的数 和上一题一样,将输入的数加上一个极大地值作为地址 #include<iostream> #include<cstdio> #include&l ...
- hdu 1425 sort
Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行 ...
- HDU 1425 sort C语言实现快速排序
AC代码:sort Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
随机推荐
- 在项目中代替DevExpress(一)
从Delphi时代开始一直都是DevExpress系列控件的忠实用户,到现在已经有10多个年头了.DevExpress里面的控件基本从头到尾都用过一次,而且也开发过很多基于DevExpress的子控件 ...
- css的active事件在手机端不生效的解决方法
对一名前端来说,改页面的过程总是痛苦的,产品经理说要加个点击样式,于是加active的class,本来以为这样就OK了,没想到电脑上ok,本地测也是ok的,tomcat上一跑就没效果了.我甚至把! i ...
- 教你写一个web远程控制小工具
惯例先上图 晚上躺床上了,发现忘关电脑了,又不想起来关,来用手机控制电脑多好,百度了下,果然一大把.哈,我自己为什么不自己也实现个呢,任意的自己diy.Just do it. 如果不想看如何实现,那么 ...
- nios II--实验4——按键中断软件部分
软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进 ...
- MPLS基础
1.1 MPLS简介 MPLS(Multiprotocol Label Switching,多协议标签交换)是一种新兴的IP骨干网技术.MPLS在无连接的IP网络上引入面向连接的标签交换概念,将第三 ...
- AngularJS引入Echarts的Demo
最近要用到图表展示,想了想,还是首选Echarts,HighCharts和D3.js备用吧, 而项目中也用到了AngularJS,所以需要把Echarts引入到AngularJs中一起使用, 试了试, ...
- 71 fdisk-Linux 的磁盘分区表操作工具。
语法: fdisk [-l] 装置名称 选项与参数: -l :输出后面接的装置所有的分区内容.若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来. 实例 列出所有分区 ...
- C#利用iComparable接口实现List排序
List<T>类可以使用Sort()方法对元素排序. Sort()方法定义了几个重载方法,分别是 public void List<T>.Sort(),不带有任何参数的Sor ...
- SpringMVC学习--异常处理器
简介 springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeExc ...
- javascript 公共方法 集合
数组去重: Array.prototype.unique1 = function () { var n = []; //一个新的临时数组 for (var i = 0; i < this.len ...