传送门

Description

给你n个整数,请按从大到小的顺序输出其中前m大的数。

Input

每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。

Output

对每组测试数据按从大到小的顺序输出前m大的数。

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(堆排序/快排/最大堆/最小堆)的更多相关文章

  1. 最大堆 最小堆 解决TOPK问题

    堆:实质是一颗完全二叉树,最大堆的特点:父节点值均大于子节点:最小堆的父节点值均小于子节点: 一般使用连续内存存储堆内的值,因而可以根据当前节点的索引值推断子节点的索引值: 节点i的父节点为(i-1) ...

  2. hdu 1425:sort(排序,经典题。快排模板)

    sort Time Limit : 6000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submissi ...

  3. E题hdu 1425 sort

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425 sort Time Limit: 6000/1000 MS (Java/Others)    M ...

  4. Black Box--[优先队列 、最大堆最小堆的应用]

    Description Our Black Box represents a primitive database. It can save an integer array and has a sp ...

  5. hdu 1425 sort 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425 常规的方法是对输入的数从大到小进行排序(可以用sort或qsort),然后输出前m大的数. 不过 ...

  6. HDU 1425 sort hash+加速输入

    http://acm.hdu.edu.cn/showproblem.php?pid=1425 题目大意: 给你n个整数,请按从大到小的顺序输出其中前m大的数. 其中n和m都是位于[-500000,50 ...

  7. HDU 1425 sort 【哈希入门】

    题意:给出n个数,输出前m大的数 和上一题一样,将输入的数加上一个极大地值作为地址 #include<iostream> #include<cstdio> #include&l ...

  8. hdu 1425 sort

    Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数.   Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行 ...

  9. HDU 1425 sort C语言实现快速排序

    AC代码:sort Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

随机推荐

  1. c++ 指针(一)

    指针:是说指针名表示的是地址.是一个变量,存储的是值的地址,而不是值本身 *运算符被称为间接值或解除引用运算符也可以叫做取地址符 声明一个指针 int * p_data; * p_data的类型为in ...

  2. C# 7.0 新特性3: 模式匹配

    本文参考Roslyn项目Issue:#206,及Docs:#patterns. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# ...

  3. [Python]新手写爬虫全过程(已完成)

    今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...

  4. Enum引发的血案,反思

    前几天公司产品更新版本,更新完后不少用户反应原先保存的report的一些表在新版本打开后设置突然变了,本来选的第六个,现在打开变成第四个了.领导要求赶紧查出原因修改好,发紧急补丁.啊啊..发紧急补丁可 ...

  5. 创业这三年¥.NET之尴尬处境

    创业这三年#迈出第一步 创业这三年@各种奇遇 之前写的文章有兴趣的大家可以看看. 本来没有打算写这样一篇会遭人拍砖的文章,但是发现大家每天忙于编码,对市场环境..Net生态没有一个真实.多角度的认识, ...

  6. Mecanim动画模型规范

    面数控制, 以三角面计算 不要超过4边的面 光滑组,法线 单位CM,单位比例 中心点 3DMax:Reset Transform Maya:Freeze Transformation 帧率:30帧 不 ...

  7. NPOI2.0学习(三)

    HSSFWorkbook wk = new HSSFWorkbook();//你用来操作的HSSFWorkbook的实例 ICellStyle cellStyle = wk.CreateCellSty ...

  8. hiho一下 第六十四周 Right-click Context Menu

    题目链接:hihocoder 第64周 题意概述: 上下文菜单是panel(面板)包括很多section(分区),一个分区里面至少包含一个菜单项.每一个菜单项都对应有一个子panel,这个panel可 ...

  9. vs2012 发布网站,

    如图这样选择就没有可以得到一个不包括 *.aspx.cs 的网站了.

  10. 15-grep 简明笔

    在文件中搜索模式 grep [options] pattern [file-list] 参数 pattern为正则表达式,file-list为grep要搜索的普通文本文件的路径名列表 选项 -c    ...