排序练习——找出前m大的数字 分类: 排序 2015-06-08 09:33 21人阅读 评论(0) 收藏

排序练习——找出前m大的数字

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

给定n个数字,找出前m大的数字。
 

输入

 多组输入,每组输入格式如下。
第一行包含两个整数n m。(n<=100000, m>0)
第二行包含n个正整数。

输出

 输出前m大的数字,若m>n输出ERROR。每组输出占一行。

示例输入

2 1
4 3
4 2
1 2 898989 23

示例输出

4
898989 23
基数排序 
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;

const int MAX=110000;

int Arr[MAX];

int Getdigit(int x,int d)
{
    return (x/d)%10;//计算每位的数字
}
void MSD_sort(int low,int high,int d)
{
    int count[10]= {0};
    int *b=new int[high-low+1];//为所有桶开辟空间
    int sum=1;
    for(int k=1;k<=d;k++)
    {
        memset(count,0,sizeof(count));
        for(int i=low;i<=high;i++)
        {
            count[Getdigit(Arr[i],sum)]++;//统计数据的数量
        }
        for(int i=1;i<=9;i++)
        {
            count[i]+=count[i-1];//设置每个桶的右边界索引
        }
        //讲数据装入桶中
        for(int i=high;i>=low;i--)//从右向左,保证数据的稳定性
        {
            int ans=Getdigit(Arr[i],sum);//计算关键码的数字;
            b[count[ans]-1]=Arr[i];//放入对应的桶中,aount[ans]-1为右边界索引
            --count[ans];
        }
        //收集数据
        for(int i=low,j=0;i<=high;i++,j++)
        {
            Arr[i]=b[j];
        }
        sum*=10;
    }
    delete b;//删除
}
int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m ))
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&Arr[i]);
        }
        if(m>n)
        {
            cout<<"ERROR"<<endl;
            continue;
        }
        MSD_sort(0,n-1,9);
        for(int i=n-1; i>=(n-m); i--)
        {
            if(i!=n-1)
                printf(" ");
            printf("%d",Arr[i]);
        }
        printf("
");
    }
    return 0;
}

<pre name="code" class="cpp">#include <bits/stdc++.h>
#define RR freopen("input.txt","r",stdin)
#define WW freopen("output.txt","w",stdout)
#define ClearAll(A,T) memset(A,T,sizeof(A))
/*
手敲快排
*/
using namespace std;

const int Max=110000;

int Arr[Max];

void Qsort(int low,int high)
{
    int i=low,j=high,s=Arr[low];
    if(i>=j)
        return ;
    while(i<j)
    {
        while(i<j&&Arr[j]<=s)
            j--;
        Arr[i]=Arr[j];
        while(i<j&&Arr[i]>=s)
            i++;
        Arr[j]=Arr[i];
    }
    Arr[i]=s;
    Qsort(low,i-1);
    Qsort(i+1,high);
}

int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {

        for(int i=0; i<n; i++)
        {
            scanf("%d",&Arr[i]);
        }
        if(m>n)
        {
            printf("ERROR
");
            continue;
        }
        Qsort(0,n-1);
        for(int i=0; i<m; i++)
        {
            if(i)
                printf(" ");
            printf("%d",Arr[i]);
        }
        printf("
");
    }

    return 0;
}
Sort:
#include <bits/stdc++.h>
#define RR freopen("input.txt","r",stdin)
#define WW freopen("output.txt","w",stdout)
#define ClearAll(A,T) memset(A,T,sizeof(A))

using namespace std;

const int Max=110000;

int Arr[Max];

bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {

        for(int i=0; i<n; i++)
        {
            scanf("%d",&Arr[i]);
        }
        if(m>n)
        {
            printf("ERROR
");
            continue;
        }
        sort(Arr,Arr+n,cmp);
        for(int i=0; i<m; i++)
        {
            if(i)
                printf(" ");
            printf("%d",Arr[i]);
        }
        printf("
");
    }

    return 0;
}
归并排序:
#include <bits/stdc++.h>
#define RR freopen("input.txt","r",stdin)
#define WW freopen("output.txt","w",stdout)
#define ClearAll(A,T) memset(A,T,sizeof(A))

using namespace std;

const int Max=110000;

int Arr[Max];

int Tarr[Max];

void Merge(int low,int mid,int high)
{
    int i=low,j=mid+1,k=0;
    while(i<=mid&&j<=high)
    {
        if(Arr[i]>=Arr[j])
            Tarr[k++]=Arr[i++];
        else
            Tarr[k++]=Arr[j++];
    }
    while(i<=mid)
    {
        Tarr[k++]=Arr[i++];
    }
    while(j<=high)
    {
        Tarr[k++]=Arr[j++];
    }
    for(i=0; i<k; i++)
    {
        Arr[low+i]=Tarr[i];
    }
}
void Qsort(int low,int high)
{
    if(low<high)
    {
        int mid=(low+high)/2;
        Qsort(low,mid);
        Qsort(mid+1,high);
        Merge(low,mid,high);
    }
}
int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {

        for(int i=0; i<n; i++)
        {
            scanf("%d",&Arr[i]);
        }
        if(m>n)
        {
            printf("ERROR
");
            continue;
        }
        Qsort(0,n-1);
        for(int i=0; i<m; i++)
        {
            if(i)
                printf(" ");
            printf("%d",Arr[i]);
        }
        printf("
");
    }

    return 0;
}
/*
先建堆后调整;
*/
#include <bits/stdc++.h>
#define RR freopen("input.txt","r",stdin)
#define WW freopen("output.txt","w",stdout)
#define ClearAll(A,T) memset(A,T,sizeof(A))

using namespace std;

const int Max=110000;

int Arr[Max];


void MaxHeap(int i,int n)
{
    int j,ans;
    ans=Arr[i];
    j=2*i+1;
    while(j<n)
    {
        if(j+1<n&&Arr[j+1]<Arr[j])
        {
            j++;
        }
        if(Arr[j]>=ans)
        {
            break;
        }
        Arr[i]=Arr[j];
        i=j;
        j=2*i+1;
    }
    Arr[i]=ans;
}
void MakeMaxHeap(int n)
{
    for(int i=n/2-1;i>=0;i--)
    {
        MaxHeap(i,n);
    }
}
void Heap(int n)
{
    for(int i=n-1;i>=0;i--)
    {
        swap(Arr[i],Arr[0]);
        MaxHeap(0,i);
    }
}
int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&Arr[i]);
        }
        if(m>n)
        {
            printf("ERROR
");
            continue;
        }
        MakeMaxHeap(n);
        Heap(n);
        for(int i=0;i<m;i++)
        {
            if(i)
                printf(" ");
            printf("%d",Arr[i]);
        }
        printf("
");
    }
    return 0;
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/juechen/p/4722054.html