🎊 算法【排序】 | 桶排序(附图解、代码)
🎊 算法【排序】 | 堆排序(附图解、代码)
🎊 算法【排序】 | 快速排序 【荷兰问题】(附代码、图解)
🎊 算法【排序】 | 归并排序【排序、逆序对、小和问题】(附图解、代码)
🎊 算法【排序】 | 插入排序(附图解、代码)
简介
工作的原理是将数组分到
有限数量
的桶子里。每个桶子再个别排序
(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序
的一种归纳结果。当要被排序的数组内的数值是均匀分配
的时候,桶排序使用线性时间O(n)。
时间复杂度
时间复杂度:
O(m+n)
;
优缺点
比较浪费空间
过程
- 首先根据数值的最后一位,将其统计在列表中;
- 在对该列表进行累加和;
- 在根据累加和以及数值列表进行取出排序;
图解
代码
/*----------------------------------------------------------------------
> File Name: bucketSort.cpp
> Author: Jxiepc
> Mail: Jxiepc
> Created Time: Sat 29 Jan 2022 08:58:11 AM CST
----------------------------------------------------------------------*/
#include <math.h>
#include <iostream>
#include <vector>
/** 求出数组长最大位数 */
int maxbits(std::vector<int>& vc) {
int max = 0;
/* 最大值 */
for(int i=0; i<vc.size(); ++i) {
if(vc[i] > max)
max = vc[i];
}
int res = 0;
while(max != 0) {
res++;
max /= 10;
}
return res;
}
/** d是位数,x是数值;返回对应位数的数 */
int getDigit(int x, int d) {
return ((int)(x/pow(10, d-1)) % 10);
}
void radixSort(std::vector<int>& vc, int L, int R, int digit) {
int radix = 10;
int i=0, j=0;
int bucket[R-L+1] = {0};
for(int d=1; d<=digit; ++d) {
int count[radix] = {0};
/* 通过位数统计次数 */
for(i=L; i<=R; ++i) {
j = getDigit(vc[i], d);
count[j]++;
}
/* 累计求和 */
for(i=1; i<radix; ++i) {
count[i] = count[i] + count[i-1];
}
/* 从左往右填入 */
for(i=R; i>=L; --i) {
j = getDigit(vc[i], d);
bucket[count[j]-1] = vc[i];
count[j]--;
}
/* 在赋值会vc */
for(i=L, j=0; i<=R; i++, j++) {
vc[i] = bucket[j];
}
}
}
int main(int argc, char* argv[])
{
std::vector<int> vc;
vc.push_back(3);
vc.push_back(40);
vc.push_back(13);
vc.push_back(30);
for(auto& i:vc) {
std::cout << i << " ";
}
std::cout << std::endl;
int res = maxbits(vc);
radixSort(vc, 0, vc.size()-1, res);
std::cout << "排序后:";
for(auto& i:vc) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}