基本思想:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置了。
//计数排序
#ifndef COUNTINGSORT_H_
#define COUNTINGSORT_H_
void CountingSort(int *A,int n, int *B, int k) //A为输入数组,n为A的长度,B为输出数组,A中每一个元素都在区间[0,k]中
{
int *count = new int[k + 1]; //count[i]为元素i出现的次数
for (int i = 0; i <= k; i++)
count[i] = 0; //初始化
for (int j = 0; j < n; j++)
count[A[j]] = count[A[j]] + 1; //统计A[j]出现次数
for (int i = 1; i <= k; i++)
count[i] = count[i] + count[i - 1]; //count[i]为数组A中小于i的个数
for (int j = n - 1; j >= 0; j--)
{
B[count[A[j]]-1] = A[j]; //A中比A[j]小的个数就是在B数组中的下标
/*上面要-1的原因是:因为计数结果不可能出现0,从1开始的,为了和下标对应,就必须减1*/
count[A[j]]--; //如果有相同数据,下一个数据排在上一个相同数据的前面
}
}
#endif
#ifndef RADIXSORT_H_
#define RADIXSORT_H_
#include <string.h>
/*
功能:去除number中第(indexN+1)位数字返回
*/
int GetDigit(int number, int indexN)
{
for (int i = indexN; i > 0; i--)
number = number / 10;
return number % 10;
}
/*
功能:对数组各个元素依据某一位进行排序
A:待排序数组
n:数组元素个数
indexN:排序依据的位数
k:基数为10,则k值为9
*/
void DigitSort(int *A, int n, int indexN, int k = 9)
{
int *count = new int[k + 1]; //count[i]为元素i出现的次数
memset(count, 0, sizeof(int)*(k+1)); //初始化为0
int *B = new int[n]; //存原数组按该位排序后的结果
memset(B, 0, sizeof(int)*n); //初始化为0
int *digit = new int[n]; //存原数组各元素该为数字
memset(digit, 0, sizeof(int)*n); //初始化为0
for (int i = 0; i < n; i++)
digit[i] = GetDigit(A[i], indexN); //注:此处是indexN
for (int j = 0; j < n; j++)
count[digit[j]] = count[digit[j]] + 1; //统计digit[j]出现次数
for (int i = 1; i <= k; i++)
count[i] = count[i] + count[i - 1]; //count[i]为数组A中小于i的个数
for (int j = n - 1; j >= 0; j--)
{
B[count[digit[j]] - 1] = A[j];
/*上面要-1的原因是:因为计数结果不可能出现0,从1开始的,为了和下标对应,就必须减1*/
count[digit[j]]--; //如果有相同数据,下一个数据排在上一个相同数据的前面
}
memcpy(A, B, sizeof(int)*n); //把排序结果写回原数组
delete[] B;
delete[] count;
delete[] digit;
}
/*
功能:基数排序
A:待排序数组
n:数组元素个数
indexN:排序依据的位数减1
注意:调用时indexN一定要将位数减1
*/
void RadixSort(int *A, int n, int indexN)
{
for (int i = 0; i <= indexN; i++) //先排地位,再排高位
DigitSort(A, n, i);
}
#endif
#include <iostream>
#include "CountingSort.h"
#include "RadixSort.h"
using namespace std;
int main()
{
int a[] = { 1, 2, 5, 6, 43, 5, 9, 25, 3 ,7};
//int b[10] = {0};
//CountingSort(a, 10, b, 43);
RadixSort(a, 10, 1);
for (int i = 0; i < 10; i++)
cout << a[i] << endl;
}