简单掌握桶排序算法及C++版的代码实现
什么是桶排序?
桶排序(Bucket Sort)是一种常见的排序算法,它将数组中的元素分组至有限数量的桶中。每一个桶都可以视为一小部分数据的集合。根据桶内的元素所构成的数据的大小关系,可以在每个桶内部再分别使用其他排序算法或者递归地进行桶排序。最后,所有的桶按照顺序依次输出,即可得到有序序列。
桶排序算法的时间复杂度
桶排序算法的时间复杂度为O(N),其中N为要排序的元素的总个数。
桶排序的实现方式及示例
C++代码如下:
// 桶排序
void bucketSort(int arr[], int n)
{
// 找到序列中最大值和最小值
int maxVal = arr[0], minVal = arr[0];
for (int i = 1; i < n; i++) {
maxVal = max(maxVal, arr[i]);
minVal = min(minVal, arr[i]);
}
// 计算桶的数量,每个桶的容量为10
int bucketNum = (maxVal - minVal) / 10 + 1;
// 初始化桶
vector<int> buckets[bucketNum];
// 将序列中的元素分配到各个桶中
for (int i = 0; i < n; i++) {
int index = (arr[i] - minVal) / 10;
buckets[index].push_back(arr[i]);
}
// 对每个桶中的元素进行插入排序
for (int i = 0; i < bucketNum; i++) {
int m = buckets[i].size();
if (m > 0) {
sort(buckets[i].begin(), buckets[i].end());
}
}
// 将排好序的桶中的元素依次输出到原序列中
int index = 0;
for (int i = 0; i < bucketNum; i++) {
int m = buckets[i].size();
for (int j = 0; j < m; j++) {
arr[index] = buckets[i][j];
index++;
}
}
}
下面以一个简单的例子,展示桶排序的实现和运行过程:
例子: 对一个数组{78,17,39,26,72,94,21,12,23,68}进行排序。
-
找到序列中最大值和最小值,maxVal=94,minVal=12。
-
计算桶的数量,每个桶的容量为10,所以桶的数量bucketNum=(94−12)/10+1=9。
-
初始化桶。
vector<int> buckets[bucketNum];
- 将序列中的元素分配到各个桶中
index = (arr[i] - minVal) / 10;
buckets[index].push_back(arr[i]);
以下是各个桶中的元素:
0:{12}
1:{17, 21, 23}
2:{26}
3:{39}
4:{}
5:{}
6:{68, 72}
7:{}
8:{78}
9:{94}
- 对每个桶中的元素进行插入排序,将排好序的桶中的元素依次输出到原序列中。
```
for (int i = 0; i < bucketNum; i++) {
int m = buckets[i].size();
if (m > 0) {
sort(buckets[i].begin(), buckets[i].end());
}
}
int index = 0;
for (int i = 0; i < bucketNum; i++) {
int m = buckets[i].size();
for (int j = 0; j < m; j++) {
arr[index] = buckets[i][j];
index++;
}
}
```
最终得到有序序列{12, 17, 21, 23, 26, 39, 68, 72, 78, 94}。
桶排序的优缺点
优点
桶排序的时间复杂度为线性时间复杂度,不需要像快速排序或归并排序那样再次排序,已经排好序的桶直接输出即可,因此非常适合于数据量大,而且数据密度比较集中的情况。如果数据的范围非常适用,十分适合使用桶排序进行排序。
缺点
桶排序需要额外的空间来存储数据,当数据量较大时可能会使用大量的空间来存储。
在使用桶排序时需要事先知道要排序的数据的范围,如果不确定数据范围,需要先求出数据的范围,再进行排序。
总结
桶排序是一个适用于各种数据范围的算法,它可以在O(N)的时间复杂度下对数据进行排序。尽管桶排序需要额外的空间来存储数据,但这个时间复杂度的优势几乎可以抵消额外的空间需求,使得桶排序成为一种非常实用的排序算法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单掌握桶排序算法及C++版的代码实现 - Python技术站