基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序基于计数排序。
- 统计待排序数组中最长位数。
int maxBit(vector<int> vec) { //返回vector中最长的元素有几位
int max = vec[0];
for (int i = 1; i < vec.size(); i++) {
if (vec[i] > max) max = vec[i];
}
int p = 1;
while (max/10 != 0) {
max = max / 10;
p++;
}
return p;
}
- 基数排序
按第1位、第2位…第maxbit位的数字进行排序
void radixSort(vector<int>& vec) {
int maxbit = maxBit(vec); //最长位数是多少,代表要进行几次排序
for (int i = 1; i <= maxbit; i++) { //i为多少,代表按第几位数字比较(从右向左)
vec=countSort(vec, i);
}
}
这里用到了一个countSort函数,由于基数排序是基于计数排序的,这个函数的作用就是按照第place位的数字对vec数组进行计数排序。
vector<int> countSort(vector<int> vec,int place) {//按指定位置的值进行计数排序
vector<int> temp(vec); //临时数组,存储place位置的值
vector<int> ordered(vec); //排好序的数组放进ordered
int count[10] = {0};
for (int i = 0; i < vec.size(); i++) {
temp[i] =(int)(vec[i] / pow(10, place - 1) )% 10; //找到每个元素place位置上的数字存在temp中
}
for (int i = 0; i < vec.size(); i++) {
count[temp[i]] ++; //统计数字出现的频率
}
for (int i = 1; i < 10; i++) {
count[i] = count[i] + count[i - 1]; //此时count中存放着temp中每个数字的索引
}
for (int i = vec.size()-1; i >=0; i--) {
int index = count[temp[i]]-1;
count[temp[i]]--;
ordered[index] = vec[i];
}
cout << "next:" << endl;
for (int i = 0; i < vec.size(); i++) {
cout << ordered[i] << " ";
}
return ordered;
}
完整代码:
// 基数排序.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int maxBit(vector<int> vec) {
int max = vec[0];
for (int i = 1; i < vec.size(); i++) {
if (vec[i] > max) max = vec[i];
}
int p = 1;
while (max/10 != 0) {
max = max / 10;
p++;
}
return p;
}
vector<int> countSort(vector<int> vec,int place) {//按指定位置的值进行计数排序
vector<int> temp(vec); //临时数组,存储place位置的值
vector<int> ordered(vec); //排好序的数组放进ordered
int count[10] = {0};
for (int i = 0; i < vec.size(); i++) {
temp[i] =(int)(vec[i] / pow(10, place - 1) )% 10; //找到每个元素place位置上的数字存在temp中
}
for (int i = 0; i < vec.size(); i++) {
count[temp[i]] ++; //统计数字出现的频率
}
for (int i = 1; i < 10; i++) {
count[i] = count[i] + count[i - 1]; //此时count中存放着temp中每个数字的索引
}
for (int i = vec.size()-1; i >=0; i--) {
int index = count[temp[i]]-1;
count[temp[i]]--;
ordered[index] = vec[i];
}
//cout << "next:" << endl;
return ordered;
}
void radixSort(vector<int>& vec) {
int maxbit = maxBit(vec); //最长位数是多少,代表要进行几次排序
for (int i = 1; i <= maxbit; i++) { //i为多少,代表按第几位数字比较(从右向左)
vec=countSort(vec, i);
}
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
}
int main()
{
vector<int> vec{ 3, 5, 34, 10, 8, 6, 16, 5, 8, 6, 2, 4, 900, 4, 7, 0, 1, 8, 9, 7, 38, 1, 2, 5, 9, 7, 4, 0, 2, 6 };
radixSort(vec);
}
测试截图: