计数排序
计数排序用于针对有输入的数值区间有负值的大值排序
/* ------------------------------------------------- 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; } }