计数排序的简单实现

本文介绍了计数排序的基本原理和实现方式,该算法通过统计数组中各元素出现的次数,利用新数组的下标来排序。虽然适用于正整数且有局限性,但其时间复杂度为O(n+k)。文中提供了两种不同的代码实现,包括直接展开和CLRS书中增加前一个数的方法,以确保元素被放置在正确的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计数排序的原理比较简单,但是很巧妙。有点类似于桶排序,但是有一些区别。

具体思想是,给定一个数组,先统计各个元素出现的次数,用元素的值做下标,得到一个新的数组。然后扫描这个数组,对于数组的每个下标,如果它对应的值不为零,说明原来数组中就有几个这样的值。由于下标的天然递增,依次将这些值展开就得到了排序后的数组。

但是计数排序有它的局限性,首先如果想用数组统计各个元素出现的次数,它的值必须是正整数。如果你想用map来统计次数的话,那么就无法保证下标的递增特性。(某些语言的map实现可能会自动按照下标排序,但复杂度就是另一回事了)。

最后,计数排序的复杂度是O(n+k),n为元素个数,k为最大值。代码如下:

// countSort.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;

vector<int> countSort(vector<int>& v)
{
	//找到最大值
	int max = -1000000;
	for (auto i : v)
		if (i >= max)
			max = i;
	
	//扫描一遍,记录各元素出现的次数
	vector<int> c;
	c.resize(max + 1);
	for (auto i : v)
		c[i]++;

	//对出现的每个元素,按照其出现的次数,依次展开到目标数组
	vector<int> ans;
	for (int i = 0; i < c.size(); i++)
	{
		if (c[i] != 0)
		{
			int temp = c[i];
			while (temp--)
				ans.push_back(i);
		}
	}
	return ans;
}

int main()
{
	vector<int> a = { 8,2,4,9,3,6,100 };
	auto 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值