点击查看代码
/*
函数功能:简单计数排序(有序排序)(元素为个位整数,且序列不含有相同值的元素)
函数列表:
a[]:待排序序列
n:待排序元素个数
*/
void CountSort(int a[], int n) {
int* tmp = new int[n]; //暂存排序后的有序序列
int count = 0;//计数器
for (int i = 0; i < n; i++) {
count = 0;//每轮开始时清空计数器
for (int j = i + 1; j < n; j++) { //扫描序列[i+1,n-1]
if (a[j] < a[i]) { //遇到小于a[i]的元素则计数器加一
++count;
}
}
//扫描结束,count表示小于a[i]的个数
//数组下标从0开始,因此a[i]在有序序列中的位置是tmp[count]
tmp[count] = a[i];
}
for (int i = 0; i < n; i++) { //将tmp[]复制回a[]中
a[i] = tmp[i];
}
delete[] tmp;//释放tmp[]占用的内存
}
/*
函数功能:进阶计数排序(有序排序)(元素位数不限制,只需要整数,序列可以含有重复值的元素)
函数列表:
a[]:待排序序列
n:待排序元素个数
*/
void CountSort(int a[], int n) {
//1、求序列最大、最小值,求出两者差值d,创建记录数组
int max = a[0], min = a[0];
for (int i = 1; i < n; i++) { //扫描序列找出最大和最小值
if (a[i] > max) {
max = a[i];
}
if (a[i] < min) {
min = a[i];
}
}
int d = max - min;
int* count = new int[d + 1];
//初始化count[]全部为0
for (int i = 0; i < d + 1; i++) {
count[i] = 0;
}
//2、序列各元素减去偏移值(最小值),统计数组统计相应元素个数
for (int i = 0; i < n; i++) {
count[a[i] - min]++;
}
//3、统计数组变形,转换为用于记录各元素在排序后的位置
for (int i = 1; i < d + 1; i++) {
count[i] = count[i - 1] + count[i];
}
//4、按照后进后出原则,倒序取出元素
int* tmp = new int[n];//tmp[]暂存排序后的元素,因为tmp[]各位置都会被使用,可以不用初始化
for (int i = n-1; i >= 0; i--) {
tmp[count[a[i]-min] - 1] = a[i]; //数组从下标0开始存储,count[]减一才是真实位置
count[a[i] - min]--; //每摆好一个元素,则记录个数减一
}
//5、排序后将tmp[]复制回a[]中
for (int i = 0; i < n; i++) {
a[i] = tmp[i];
}
delete[] tmp; //释放tmp[]和count[]占用的内存
delete[] count;
}