基数排序 【数据结构之基数排序】先把最大数找到,用来判断最高位。终止循环用的
然后把数字根据位上的数来判断放在哪个桶里面(并不是把数字放进桶里,只是把这个桶的数字加一,代表桶中有一个数,就是为了记录桶中已经假装放了多少个数)
然后再把前面的记录和自己的记录加起来,这样就知道假装放进自己这个桶里的数的下标,应该是多少。
(比如说本来有三个排队窗口但是现在其中两个都下班了,只剩下最后一个窗口了,然后这最后一个窗口让所有人都来这个窗口排序,,但是这个排序还是跟以前一样的,一号窗口的人排在最前面二号次之三号再次之)
知道每个假装放进桶里的数的下标之后,,就把他们从原数组中从后往前取出并放进临时数组里面。然后再把临时数组里面的值放进原数组里面
然后继续下一位
#include
#include #define BASE 10 //基数桶[0-9]void radixsort(int *arr, int size){
int i;
int max = arr[0];
for (i = 1;
i < size;
i++){
if (max < arr[i])
max = arr[i];
}
int exp = 1;
int *temp = (int*)malloc(sizeof(int)*size);
//临时数组
while (max / exp>0){
int Bucket[BASE] = { 0 };
//桶,,有十个桶for (i = 0;
i < size;
i++){//个位或更高的位上数字相同则桶记数加一相当于把数字放入桶中
++Bucket[(arr[i] / exp) % BASE];
}//这里,,,比如说本来有三个排队窗口但是现在其中两个都下班了,只剩下最后一个窗口了,
//然后这最后一个窗口让所有人都来这个窗口排序,,但是这个排序还是跟以前一样的,一号窗口的人排在最前面二号次之三号再次之
//这样我得把前面所有人数加起来才知道我排在第几位
//比如下标为1的桶中有2个元素下标为2的桶中有1个元素
//那么当把下标为2的桶的元素放在临时数组中时,应该在下标为1的桶中的元素的后面也就是1+2
//这样在临时数组中排到的序号就是3
for (i = 1;
i < BASE;
i++){
Bucket[i] += Bucket[i - 1];
}
//从后往前是因为前面入桶的时候是从前往后
//那么当从后往前时放进临时数组的刚好就是取的每个桶的最后一个数
for (i = size - 1;
i >= 0;
i--){
temp[--Bucket[(arr[i] / exp) % BASE] ]= arr[i];
}//最后再把临时数组中按个位或更高位排好序的放回到arr数组中
for (i = 0;
i < size;
i++){
arr[i] = temp[i];
}
exp *= BASE;
}
free(temp);
}
int main()
{
int arr[] = { 27, 91, 1, 97, 17, 23, 84, 28, 72, 5, 67, 25 };
int size = sizeof(arr) / sizeof(int);
// soer
radixsort(arr, size);
//print
int i;
for (i = 0;
i < size;
++i)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
推荐阅读
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 数据结构和算法|LeetCode 的正确使用方式
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 算法|算法-二分查找
- 数据结构学习指导|数据结构初阶(线性表)
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- java|ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔