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++桶排序原理及实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 从 Spring Boot 3+Java 21 到 Spring Boot 4+Java 25迁移全指南与注意事项

    从 Spring Boot 3+Java 21 到 Spri

    本文介绍了从SpringBoot3+Java21升级到SpringBoot4+Java25的具体步骤与注意事项,主要包含环境与依赖自查、代码适配、进阶优化、测试与验证以及迁移checklist等内容,感兴趣的朋友跟随小编一起看看吧
    2026-04-04
  • StringBuilder如何拼接(截取)想要的字符串

    StringBuilder如何拼接(截取)想要的字符串

    文章主要介绍了Java中字符串操作的两种常用类StringBuilder和StringBuffer,以及三元表达式的使用和字符串截取的方法
    2024-12-12
  • springboot泛型封装开发方式

    springboot泛型封装开发方式

    这篇文章主要介绍了springboot泛型封装开发方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java实现pdf转图片案例

    Java实现pdf转图片案例

    这篇文章主要介绍了Java实现pdf转图片案例,按照步骤放置代码,一步步完成该案例,将代码部署便可,需要的朋友可以参考下
    2021-06-06
  • Java 对象深拷贝工具类的实现

    Java 对象深拷贝工具类的实现

    本文主要介绍了Java 对象深拷贝工具类的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • SpringBoot中MapStruct实现优雅的数据复制

    SpringBoot中MapStruct实现优雅的数据复制

    本文主要介绍了SpringBoot中MapStruct实现优雅的数据复制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • SpringBoot获取配置文件中的配置项的常用方式

    SpringBoot获取配置文件中的配置项的常用方式

    这篇文章主要介绍了SpringBoot获取配置文件中的配置项的常用方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-11-11
  • java中MultipartFile和File最简单的互相转换示例

    java中MultipartFile和File最简单的互相转换示例

    这篇文章主要给大家介绍了关于java中MultipartFile和File最简单的互相转换的相关资料,MultipartFile和File都是Java中用于处理文件上传的类,MultipartFile用于处理上传的文件,File用于处理本地磁盘上的文件,需要的朋友可以参考下
    2023-09-09
  • Java中接口和抽象类的异同以及具体的使用场景

    Java中接口和抽象类的异同以及具体的使用场景

    文章主要介绍了Java中接口(Interface)和抽象类(AbstractClass)的区别和联系,包括相同点和不同点,以及它们在实际开发中的具体使用场景,结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • 基于java时区转换夏令时的问题及解决方法

    基于java时区转换夏令时的问题及解决方法

    下面小编就为大家分享一篇基于java时区转换夏令时的问题及解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11

最新评论