计数排序

点击查看代码

/*
函数功能:简单计数排序(有序排序)(元素为个位整数,且序列不含有相同值的元素)
函数列表:
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;
}

posted @ 2022-09-26 22:03  zhaoo_o  阅读(1)  评论(0编辑  收藏  举报