C++排序算法之桶排序原理及实现详解

 更新时间:2023年10月30日 10:40:04   作者:大庆指针  
这篇文章主要介绍了C++排序算法之桶排序原理及实现详解, C++ 桶排序是一种线性时间复杂度的排序算法,它通过将待排序元素分配到不同的桶中,然后对每个桶中的元素进行排序,最后将所有桶中的元素按顺序合并得到有序序列,需要的朋友可以参考下

思想

原理:将数值作为桶号,遍历整个数组,将相应的桶进行计数

1、 遍历原数组,找到最大值max,然后申请max+1个空间(桶),初始化为0(下标为0-max),即    vector<int>bucket(max+1,0)   

2、 再次遍历原数组,找到每个数值对应的桶号,并对桶计数++,即bucket[vec[i]]++

3、 遍历桶数组,看对应的桶内计数为几就取出几下下标值(桶号),放到原数组中。

代码

#include<iostream>
#include<vector>
using namespace std;
void bucketSort(vector<int>&vec, int n)
{
	int max = vec[0];
	for (int i = 0; i < n; i++)
	{
		if (vec[i] > max)
		{
			max = vec[i];
		}
	}
	//申请max+1个桶
	//int *bucket = new int[max + 1];
	//给每个桶赋初值为0;
	//memset(bucket, 0, (max + 1) * sizeof(int));
	vector<int>bucket(max + 1, 0);
	//遍历原数组,把相应的数放到相应的桶里
	for (int i = 0; i < n; i++)
	{
		bucket[vec[i]]++;
	}
	int index = 0;
	//从桶里把数取出来, i代表的数值对应桶下标, bucket[i]代表的是个数
	for (int i = 0; i < bucket.size(); i++)
	{
		while (bucket[i] > 0)
		{
			vec[index++] = i;
			bucket[i]--;
		}
	}
}
int main()
{
	vector<int>vec = { 2,3,5,8,9,7,4,6,1 };
	bucketSort(vec, vec.size());
	for (auto it : vec)
	{
		cout << it << " ";
	}
	return 0;
}

时间复杂度

  • 遍历数组找最大值max 时间复杂度为O(n)
  • 遍历数组把对应的数放入对应的桶时间复杂度也为O(n)
  • 遍历桶,从桶中把数取出来放入原数组,假设有m个空桶,则时间复杂度为O(n+m)

总上所述时间复杂度为O(3n+m)=O(n)

空间复杂度

创建了辅助数组(桶),即max+1个桶,(不管创建多少桶,只要创建了辅助数组,空间复杂度就是O(n))

稳定性:稳定

到此这篇关于C++排序算法之桶排序原理及实现详解的文章就介绍到这了,更多相关C++桶排序原理及实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论