zoukankan      html  css  js  c++  java
  • 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+1) QuickSort(low,left-1);
    else{
    QuickSort(low,left-1);
    QuickSort(left+1,high);
    }
    }
    int main(){
    int i;
    int j;
    int n;
    while(scanf("%d%d",&n,&m)!=EOF){
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    QuickSort(0,n-1);
    for(i=0;i<m;i++){
    printf("%d",a[i]);
    if(i!=m-1)
    printf(" ");//注意最后没有空格
    }
    printf("
    ");//每组数据输出一行
    }
    return 0;
    }
    View Code
  • 相关阅读:
    docker logs-查看docker容器日志
    初探 Elasticsearch,学习笔记第一讲
    Centos7 环境下设置固定IP
    强制使用索引查询方法
    linux 常用命令
    MySQL 调优
    docker 常用命令
    mysql 创建临时表
    mysql or in union all 使用方法
    mysql 创建存储过程
  • 原文地址:https://www.cnblogs.com/helloworld2019/p/10451447.html
Copyright © 2011-2022 走看看