c++桶排序(刚学也能看懂)

本文详细介绍了桶排序算法,它是计数排序的升级版,利用函数映射关系高效排序。文章通过实例解释了如何将数据分桶并排序,给出了C++与Python实现代码。
该文章已生成可运行项目,

目录

 

哈喽😆

穿梭门

效果🧐

桶排序是什么💡

🤔再简单点说

👀再再简单点说

思路

确定“分桶”个数🔍

复杂度分析😐

c++代码实现

python版代码(嘿嘿,没想到吧)

最后


 

哈喽😆

这次来发一下桶排序,它的时间复杂度低,代码也不难

穿梭门

二分算法

堆排序

效果🧐

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_20,color_FFFFFF,t_70,g_se,x_16

就是排序

所以说,还是比较简单滴 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_20,color_FFFFFF,t_70,g_se,x_16

桶排序是什么💡

桶排序是计数排序的升级版,也是分治算法。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。简言之,将值为i的元素放入i号桶,最后依次把桶里的元素倒出来。
怎么样,是不是很“简单”?                  

还有这张一看就头疼的图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_20,color_FFFFFF,t_70,g_se,x_16

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_15,color_FFFFFF,t_70,g_se,x_16                       

 🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔

🤔再简单点说

桶排序的基本思想是假设数据在[min,max]之间均匀分布,其中min、max分别指数据中的最小值和最大值。那么将区间[min,max]等分成n份,这n个区间便称为n个桶。将数据加入对应的桶中,然后每个桶内单独排序。由于桶之间有大小关系,因此可以从大到小(或从小到大)将桶中元素放入到数组中。

👀再再简单点说

简单说,你有一个数组1 , 3 , 7 , 77 ,100 ,234

比如,

你把一位数、两位数和三位数分到3个桶里,

各自排完序再合到一起

排序前:1 , 3 , 7 , 77 ,100 ,234

一位数:1、7、3

两位数:77

三位数:100、234

排序后:

一位数:1、3、7

两位数:77

三位数:100、234

合起来:1、3、7、77、100、234 

思路

1.设置一个定量的数组当作空桶子。
2.寻访序列,并且把项目一个一个放到对应的桶子去。
3.对每个非空的桶子进行排序。
4.从不是空的桶子里把项目再放回原来的序列中。

确定“分桶”个数🔍
 

假如要对数组arr={ 2,0,1,6,8,10,5,99,87,333,2,0,1 }排序,假设需要桶的个数为bucketNum=std::ceil(size/3),向上取整,反之桶个数不够映射时越界。

复杂度分析😐


桶排序实际上只需要遍历一遍所有的待排序元素,然后依次放入指定的位置,如果加上输出排序的时间,那么需要遍历所有的桶,时间复杂度为O(n+m),其中n为待排序元素的个数,m为桶的个数,这时相当快的排序算法,但是,对于空间的小号来说太大了。当n越大,空间浪费就越大,所以,如果数据跨度过大,桶排序并不适用跨度范围大的排序。

c++代码实现

直接放代码,如果你报错了,就把前面的万能头文件改了

c++版(devc++无报错无警告)

#include <bits/stdc++.h>
using namespace std;

// 打印数组
void print_array(int *arr, int n) {
    if(n==0){
        printf("ERROR: Array length is ZERO\n");
        return;
    }
    printf("%d", arr[0]);
    for (int i=1; i<n; i++) 
        printf(" %d", arr[i]);
    printf("\n");
}


int* sort_array(int *arr, int n) {
    int i;
	int maxValue = arr[0];
	for (i = 1; i < n; i++) 
		if (arr[i] > maxValue)  // 输入数据的最大值
			maxValue = arr[i]; 
	
	// 设置10个桶,依次0,1,,,9
	const int bucketCnt = 10;
	vector<int> buckets[bucketCnt];
	// 桶的大小bucketSize根据数组最大值确定:比如最大值99, 桶大小10
	// 最大值999,桶大小100
	// 根据最高位数字映射到相应的桶,映射函数为 arr[i]/bucketSize
	int bucketSize = 1;
	while (maxValue) {		//求最大尺寸 
		maxValue /= 10;
		bucketSize *= 10;
	}
	bucketSize /= 10;		//桶的个数 
	// 入桶
	for (int i=0; i<n; i++) {
		int idx = arr[i]/bucketSize;			//放入对应的桶 
		buckets[idx].push_back(arr[i]);
		// 对该桶使用插入排序(因为数据过少,插入排序即可),维持该桶的有序性
		for (int j=int(buckets[idx].size())-1; j>0; j--) {
			if (buckets[idx][j]<buckets[idx][j-1]) {
				swap(buckets[idx][j], buckets[idx][j-1]);
			}
		}
	}
	// 顺序访问桶,得到有序数组
	for (int i=0, k=0; i<bucketCnt; i++) {
		for (int j=0; j<int(buckets[i].size()); j++) {
			arr[k++] = buckets[i][j];
		}
	}
	return arr;
}



int main() {
    int n;
    scanf("%d", &n);
    
    int *arr;
    arr = (int*)malloc(sizeof(int)*n);
    
    for (int i=0; i<n; i++) scanf("%d", &arr[i]);
    
    arr = sort_array(arr, n);
    
    print_array(arr, n);
    
    system("pause"); 
    return 0;
}

python版代码(嘿嘿,没想到吧)

def bucketSort(nums):
    # 选择一个最大的数
    max_num = max(nums)
    # 创建一个元素全是0的列表, 当做桶
    bucket = [0]*(max_num+1)
    # 把所有元素放入桶中, 即把对应元素个数加一
    for i in nums:
        bucket[i] += 1
 
    # 存储排序好的元素
    sort_nums = []
    # 取出桶中的元素
    for j in range(len(bucket)):
        if bucket[j] != 0:
            for y in range(bucket[j]):
                sort_nums.append(j)
 
    return sort_nums
 
nums = [5,6,3,2,1,65,2,0,8,0]
print bucketSort(nums)
 
"""
[0, 0, 1, 2, 2, 3, 5, 6, 8, 65]
"""

最后

今天想给大家推荐一本书

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWVJfVA==,size_15,color_FFFFFF,t_70,g_se,x_16

 

 互粉必回!   白白👋

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文章已经生成可运行项目
### C++ 桶排序实现 桶排序是一种分配式的排序算法,其核心思想是将数组分到有限数量的桶里。每个桶再分别进行排序(通常使用其他排序算法或者递归地应用桶排序)。以下是基于给定引用的内容以及标准实践的一个完整的 C++ 桶排序实现。 #### 完整代码示例 ```cpp #include <iostream> #include <vector> using namespace std; // 辅助函数:获取数组的最大值 int getMax(const vector<int>& arr) { int maxVal = arr[0]; for (const auto& num : arr) { if (num > maxVal) { maxVal = num; } } return maxVal; } // 桶排序的核心逻辑 void bucketSort(vector<int>& arr) { if (arr.empty()) return; // 如果数组为空,则直接返回 int n = arr.size(); int maxVal = getMax(arr); // 获取数组中的最大值 // 创建桶并初始化为 0 vector<int> buckets(maxVal + 1, 0); // 将元素放入对应的桶中 for (int i = 0; i < n; ++i) { buckets[arr[i]]++; } // 输出桶中的元素顺序 int index = 0; for (int i = 0; i <= maxVal; ++i) { while (buckets[i] > 0) { arr[index++] = i; buckets[i]--; } } } int main() { vector<int> arr = {2, 3, 1, 8, 5, 10, 4, 3, 9, 6}; cout << "原始数组: "; for (auto num : arr) { cout << num << " "; } cout << endl; bucketSort(arr); cout << "排序后的数组: "; for (auto num : arr) { cout << num << " "; } cout << endl; return 0; } ``` 此代码实现了基本的桶排序功能[^1]。它通过计算输入数组中的最大值来决定桶的数量,并利用辅助数组 `buckets` 来记录每个数值出现的次数。最终按照索引依次填充回原数组完成排序。 --- ### 关键点解析 1. **时间复杂度**: 当输入数据均匀分布时,桶排序的时间复杂度接近于线性 \(O(n)\)[^3]。但如果所有数据集中在少数几个桶内,则性能会退化至 \(O(n^2)\) 或更差的情况。 2. **空间复杂度**: 空间需求取决于桶的数量和大小,在本例中为 \(O(\text{max} - \text{min})\) 的额外存储开销[^1]。 3. **适用场景**: 此版本适合处理正整数集合且范围较窄的情形。对于浮点型或其他类型的元素则需进一步扩展思路[^2]。 ---
评论 26
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值