遍历数组找到最大的数max,做为桶的桶号,即桶长度为max+1,将桶中的数全部置为0,遍历原数组,在同种记录原数组中各个数出现的个数
void bucketSort(vector<int> &arr) {
int n = arr.size();
int max = arr[0];
//找到原数组中最大的数
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
//建立一个新的数组,即桶,来记录原数组中各个数出现的次数
vector<int> vec(max + 1); //vector<int> vec(max+1,0);
for (int i = 0; i < n; i++) {
vec[arr[i]]++;//原数组中的数对应的桶的位置,进行出现次数的统计
}
int m = vec.size();//或者直接用max + 1表示新创建的数组的大小
int index = 0;
for (int i = 0; i < m; i++) {//遍历桶将桶中的东西放回原数组中
while (vec[i]!=0)//将桶中不为0的位置的数,有几个全部放回原数组中
{
arr[index++] = i;
vec[i]--;
}
}
}
完整代码:与上面大体一致,只是重敲了一遍
#include<iostream>
#include<vector>
using namespace std;
void bucketSort(vector<int>& arr) {
int n = arr.size();
if (n <= 1) {
return;
}
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
vector<int> vec(max + 1, 0);
for (int i = 0; i < n; i++) {
vec[arr[i]]++;
}
int index = 0;
for (int i = 0; i < max + 1; i++) {
while (vec[i] != 0) {
arr[index++] = i;
vec[i]--;
}
}
}
void printArr(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
int main() {
vector<int> arr = { 7,9,4,9,8,5 };
bucketSort(arr);
printArr(arr);
return 0;
}
时间复杂度:只进行了单层的for循环 O(N)
空间复杂度:额外申请了数组空间 O(N)