【数据结构】八大排序之基数排序(桶排序代码详述)

一、思想 1、核心
对每一位数据找到个位,十位、百位…然后将数据按照位数放在对应的桶中,再按照桶的顺序从前往后、从上到下取出,这样每次从个位、十位、百位,一直到最大的位数都是顺序排列的
2、图解桶排序过程
【数据结构】八大排序之基数排序(桶排序代码详述)
文章图片

【数据结构】八大排序之基数排序(桶排序代码详述)
文章图片

3、思考
【【数据结构】八大排序之基数排序(桶排序代码详述)】(1)怎么找到每个数据的位数?
用每一位数进行比较,找到最大的数字,在设置一个计数器count,把最大数每次除10,count++,直到为0,退出,最终count的值为最大值的位数。
(2)找到位数后,如何知道该数据对应位数的数字?
用一个函数pow(),要用到头文件
pow(10.0,pos)求次方,表示10的pos次方
如果pos = 0,得到的是1; pos = 1,得到的是10; pos = 2,得到的是100。
直接返回val / (int)(pow(10.0, pos)) % 10; //val为数据
例如:2346 ,如果pos是2,pow结果是100,说明排的是百位,用2346除100,得到23,最后取余10,就得到数据3。
(3)排序的趟数该怎么知道?
排序的趟数也就是最大数的位数。
二、代码(详细注释)

#include #include #include//①2346如果pos是2,pow结果是100,说明排的是百位,就要得到数据3 //②pow(10.0,pos)求次方,10的pos次方 //如果pos = 0,得到的是1; pos = 1,得到的是10; pos = 2,得到的是100, int GetFiNumber(int val, int pos)//给出一个数据,求出该数据对应位数的数字 { return val / (int)(pow(10.0, pos)) % 10; }//入桶存数据、出桶取出数据 void Radix(int arr[], int len, int figure) { int* bucket[10]; //给出10个桶 int i = 0; int finum; //每个数据位数上的数字,也就是代表几号桶 int count[10] = {}; //每个桶里当前可插入元素的下标,也可标识当前桶中的元素个数 int arrindex = 0; //代表数据存放的数组的起始下标 int bucketindex = 0; //代表每个桶的起始下标 for (i; i < 10; i++)//给10个桶开辟空间 { bucket[i] = (int*)malloc(sizeof(int)*len); } for (i = 0; i < len; i++)//把数据放入桶中 { finum = GetFiNumber(arr[i], figure); //获取arr[i]对应的位数该存放在几号桶中 bucket[finum][count[finum]] = arr[i]; //count[finum]表示finum号桶里面可插入元素的下标 //表示将arr[i]存放在有[count[finum]]元素的finum号桶中 count[finum]++; //每次给finum号桶++,就能使count[]标识桶中的元素 } for (i = 0; i < 10; i++)//把桶中所有元素取出放进数组 { bucketindex = 0; while (count[i] != 0)//桶里有元素 { arr[arrindex] = bucket[i][bucketindex]; //i对应的桶里面bucketindex bucketindex++; arrindex++; count[i]--; } } for (i = 0; i < 10; i++) { free(bucket[i]); } }//找数组中的最大数,并求出最大数的位数 int GetMaxfigure(int arr[], int len) { int max = -1; int count = 0; int i = 0; for (i; i < len; i++) { if (arr[i] > max) { max = arr[i]; } } while (max != 0) { max = max / 10; count++; } return count; }//通过最大数的位数控制了排序趟数 void RadixSort(int arr[], int len) { int MaxFi = GetMaxfigure(arr, len); //最大的位数 int i = 0; for (i; i < MaxFi; i++) { Radix(arr, len, i); } }int main() { int arr[] = {3, 2, 43, 46, 75, 12, 4, 235, 45, 7, 34 }; int len = sizeof(arr) / sizeof(arr[0]) int max = GetMaxfigure(arr, len); printf("%d\n", max); RadixSort(arr, len); for (int i = 0; i < len; i++) { printf("%d", arr[i]); } printf("\n"); return 0; }

    推荐阅读