计数排序简介
- 计数排序用于对已知数组元素范围的数组进行排序,要求输入的数据必须是有确定范围的整数
- 这个算法于1954年由 Harold H. Seward 提出
- 比如比如100万学生参加高考,对这100万学生的某科成绩(假设分数为整数的0到100)做个排序,计数数组的作用就是0-100分,统计落到每个分数上的学生分别有多少个
计数排序步骤
- 它创建一个长度为这个数据范围的计数数组C
- 计数数组计算大小:通过遍历排序数组,得到排序数组中的最大值和最小值,之差就是计数数组的大小
- C中每个元素记录要排序数组中对应记录的出现个数
- 遍历计数数组,对原数组排序
- 时间:O(n),空间:O(m),m是原数组最大值与最小值的差,可能是n
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<vector>
using namespace std;
int a = 0;
int b = 10;
int getMinVal(vector<int>&v){
int min_val = v[0];
for(int val:v){
if(val < min_val)
min_val = val;
}
return min_val;
}
int getMaxVal(vector<int>&v){
int max_val = v[0];
for(int val:v){
if(val > max_val)
max_val = val;
}
return max_val;
}
void CountSort(vector<int>&v){
int tmp_size = getMaxVal(v) - getMinVal(v) + 1;
vector<int>cntArr(tmp_size,0);
for(int val:v)
cntArr[val]++;
int index = 0;
for(int i = 0; i < tmp_size; i++){
while(cntArr[i] > 0){
v[index++] = i;
cntArr[i]--;
}
}
}
int main(){
srand(unsigned(time(NULL)));
int rand_num;
vector<int>v;
cout<<"原数组:";
for(int i = 0; i < 10; i++){
rand_num = a+(rand()%(b-a));
v.push_back(rand_num);
cout<<rand_num<<" ";
}
CountSort(v);
cout<<endl<<"排序后数组:";
for(int val:v)
cout<<val<<" ";
return 0;
}
本文参考