《算法导论》学习总结 — 8.第八章(2) 计数排序

这一节讲的是线性排序。

一.计数排序(Counting Sort)

基本思想:对每一个输入元素x,确定出小于x的元素个数。

适用范围:适用于输入是由小范围的整数构成的序列。

稳定性:算法是稳定的。

具体实现:

#include 
using namespace std;

// arr--初始输入数组, res--存放排序结果的数组,hash临时存储区[0...k]
int arr[100], res[100], hash[100];
int len, k = -1;

void PrintHash()
{
	cout << "Hash数组: " << endl;
	for(int i=0; i<=k; ++i)
		cout << hash[i] << " ";
	cout << endl;
}

void countingSort()
{
	for(int i=0; i<=k; ++i)
		hash[i] = 0;
	// 此过程记录每一个元素的个数
	for(int i=1; i<=len; ++i)
		++hash[arr[i]];
	PrintHash();
	// 此过程确定小于x的元素的个数
	for(int i=1; i<=k; ++i)
		hash[i] += hash[i-1];
	PrintHash();
	// 思考这里为何从i=len开始?而不从i=1开始?
	for(int i=len; i>0; --i)
	{
		res[hash[arr[i]]] = arr[i];
		--hash[arr[i]];
	}
}
/*
思考这里为何从i=len开始?而不从i=1开始?
保持排序后结果的稳定性!
因为同一个元素,靠后的元素在排序后相对也是从后开始存入结果数组的。
*/

int main()
{
	cout << "输入元素个数: ";
	cin >> len;
	cout << "输入" << len << "个元素: " << endl;
	for(int i=1; i<=len; ++i)
	{
		cin >> arr[i];
		if(k < arr[i])
			k = arr[i];
	}
	countingSort();
	cout << "排序后结果为: " << endl;
	for(int i=1; i<=len; ++i)
		cout << res[i] << " ";
	cout << endl;
}

输出结果:

jishupaixu

原文地址:https://www.cnblogs.com/downtjs/p/3343751.html