1. 程式人生 > 其它 >2022春每日一題:Day 14

2022春每日一題:Day 14

計數排序基本操作

計數排序用於針對有輸入的數值區間有負值的大值排序

/*
-------------------------------------------------
   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; } }