计数排序

核心思想:计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。
作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

思路:

  1. 找出待排序的数组中最大和最小的元素
  2. 统计数组中每个值为i的元素出现的次数,存入数组C的第i项
  3. 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
  4. 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

代码实现:

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
void counting_sort(vector<T> &ini_vec, vector<T> &sorted_vec) {
	vector<T> vCount(ini_vec);
	int n = ini_vec.size();
	for (int k = 0; k < n; k++)
		vCount[k] = 0;
	for (int i = 0; i < n; i++)
		vCount[ini_vec[i]]++;
	for (int k = 1; k < n; k++)
		vCount[k] += vCount[k - 1];
	for (int j = n; j > 0; j--)
		sorted_vec[--vCount[ini_vec[j - 1]]] = ini_vec[j - 1];
}

int main() {
	vector<int> v1{ 1, 2, 3, 8, 4, 5, 7, 8, 9, 10, 11, 2, 5, 6, 4 };
	vector<int> v2(v1);
	//此處略去最大值的選擇,後續可以優化
	counting_sort(v1, v2);
	for (auto v :v2)
		cout <<v << endl;
	return 0;
}
posted on 2021-04-18 15:42  逆流而上の鱼  阅读(218)  评论(0)    收藏  举报