计数排序
利用计数数组(初始化0),遍历原数组,将元素i出现一次,那么将计数数组引索i的位置的数组加1,然后利用遍历计数数组输出
#include <iostream>
#include <Windows.h>
#include <vector>
using namespace std;
void InputVec(vector<int> & arr)
{
int n = arr.size();
for (size_t i = 0; i < n; i++)
{
cin >> arr[i];
}
}
void OutputVec(const vector<int>& arr)
{
for (int i = 0; i < arr.size(); i++)
{
cout << arr[i] <<" ";
}
cout << endl;
}
void CountingSort(vector<int>& arr)
{
int max = MININT;
int min = MAXINT;
for (int i = 0; i < arr.size(); i++)
{
if (arr[i] < min) min = arr[i];
if (arr[i] > max) max = arr[i];
}
int* countingArray = new int[max - min + 1]();
for (int i = 0; i < arr.size(); i++)
{
countingArray[arr[i] - min]++;
}
vector<int> res(arr.size());
int p = 0;
for (int i = 0; i < max - min + 1; i++)
{
for (int j = 0; j < countingArray[i]; j++)
{
res[p++] = i + min;
}
}
arr.swap(res);
delete[]countingArray;
}
int main()
{
int n;
cin >> n;
vector<int> arr(n);
InputVec(arr);
CountingSort(arr);
OutputVec(arr);
}
基数排序
按关键字分配和收集。
void RadixSort(vector<int>& arr)
{
//找到最大的数
int max = MININT;
for (int i = 0; i < arr.size(); i++)
{
if (max < arr[i]) max = arr[i];
}
int nRadix = 0;
while (max != 0)
{
nRadix++;
max /= 10;
}
vector<vector<int> > bucket(10);
for (int i = 0; i < nRadix; i++)
{
//分配过程
int nDig =(int)pow(10,i);//1,10,100...
for (int j = 0; j < arr.size(); j++)
{
bucket[(arr[j]/nDig)%10].push_back(arr[j]);
}
//收集过程
vector<int> res;
for (int nbucket = 0; nbucket < 10; nbucket++)
{
for (int t = 0; t < bucket[nbucket].size(); t++)
{
res.push_back(bucket[nbucket][t]);
}
}
arr.swap(res);
vector<vector<int> > emptybucket(10);
bucket.swap(emptybucket);
}
}