桶排序
博主是一个大一刚刚放暑假的大学生,大学我们只学习了c语言,现在这么卷只学c语言肯定不够,所以博主打算从零开始恶补c++顺便写文章记录一下,另外博主这个暑假还想记录一些算法基础内容欢迎关注哦。这些是是一些算法的记录和整理总结笔记要是什么时候忘记了这个算法那个算法怎么做就重新来看看,在csdn上面发是为了利用网址来编写思维导图的话比! 较方便~~~如果大家想跟着我一起学习也可以关注我~或者给这个文章点赞~~~谢谢大家了~
前言:
我们之前学过的排序都是基于比较的排序但桶排序是一个不基于比较的排序 **不基于比较的排序:**无法通过比较来判断大小要根据数据状况定制的是一类很小众的算法
基数排序(桶排序)思路:
1.看最大的有几位,把数组的数补成相同的位数 2.准备几个桶(把所有要出现的数字都当做桶) 3.从个位开始把每位数字放进桶里 4.把桶从左向右把所有的数字都倒出来(先进桶的先出桶) 5.十位数字重复3.4步。 6.百位数字重复3.4步。 7.最后全部重复完了就可以发现数字神奇的排好了!!! 因为我们是从个位开始排的一直到最高位所以数字可以从低到高排序 注意如果是桶排序的话必须有进制
桶排序代码:
解析都在代码里哦!一看就懂,这里的重点是运用了一个分片的思想
#include<iostream>
#include<math.h>
using namespace std;
int getdigit (int x, int d);
int getdigit (int x, int d){
return ((x /((int) pow(10, d - 1))) % 10);
}
void radixsort (int* a, int L, int R, int digit);
void radixsort (int* a , int L, int R, int digit){
const int radix = 10;
int i = 0, j = 0;
int b1[R - L + 1];
for (int d = 1; d <= digit; d++ ){
int count1[radix] = {0};
for (i = L; i <= R; i++)
{
j = getdigit(a[i], d);
count1[j]++;
}
for (i = 1; i < radix; i++)
{
count1[i]= count1[i] + count1[i - 1];
}
j = 0;
for (i = R; i >= L; i--)
{
j = getdigit(a[i], d);
b1[count1[j] - 1] = a[i];
count1[j]--;
}
j = 0;
for(i = L; i <= R; i++){
a[i] = b1[j];把辅助数组里面存的数据给我们的数组
j++;
}
}
}
int maxbits (int* a, int arr_len);
int maxbits (int* a, int arr_len)
{
int max=a[0];
for( int i = 1; i < arr_len; i++)
{
if(a[i] > max)
{
max = a[i];
}
}
int con = 0;
while(max != 0)
{
max /= 10;
con ++;
}
return con;
}
int main()
{
int n;
cin >> n;
int a[n];
for (int i = 0;i < n; i++) {
cin >> a[i];
}
radixsort(a, 0, n-1, maxbits(a, n));
for (int i = 0;i < n; i++) {
cout << a[i] << ' ';
}
}
热爱可抵岁月漫长
|