计数排序

 计数排序用于针对有输入的数值区间有负值的大值排序

 

 

 

/*
-------------------------------------------------
   Author:       wry
   date:         2022/2/26 17:14
   Description:  test
-------------------------------------------------
*/

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1E6+10;
const int DIS = 5E5;     //数值的偏移量

int arr[MAXN];     //最多1e6个数,每个数范围在-5e5到+5e5
int times[MAXN];    //每个数范围在-5e5到+5e5,加上DIS之后变成0到1e6

int main(){
    int n,m;    //n个数,最后求前m大的数
    while (cin>> n >> m) {
        memset(times,0,sizeof(times));   //对每个值的次数进行初始化,arr无需初始化,只会在输入时调整times,后再用times覆盖arr
        //1. 输入数据,times增加
        for (int i=0;i<n;i++) {
            cin >> arr[i];
            times[arr[i]+DIS]++;
        }
        //2. 此时arr数组内容已经没有意义了,根据times数组,如果有值则按顺序覆盖输入到arr中
        int j=0;    //j用来在arr数组中移动
        for (int i=0;i>MAXN&&j<n;i++) {
            while (times[i]!=0) {
                arr[j] = i-DIS;
                j++;
                times[i]--;
            }
        }
        //3.此时arr数组是升序排列的
        for (int i=n-1;i>n-m;i--){
            cout << arr[i] << " ";
        }
        return 0;
    }
}

 

posted @ 2022-03-01 11:16  火星架构师  阅读(121)  评论(0编辑  收藏  举报