478 字
2 分钟
基数排序-最低位优先法
基数排序-最低位优先法
算法思维
- 基数排序是一种非比较型的排序,其原理是把数字按位数分割,然后对每一位进行分配和收集
- 最低位优先法就是从数字的最低为开始,依次分配和收集
- 最低位优先法相较于最高位优先法,最低位优先法不需要分子序列
算法设计
- 确定数字最高位数
- 对每个数字的每一位从低位到高位进行下面操作
- 先按照位数大小进行分配,然后按照排列顺序进行收集,根据分配收集的特性,可以用队列来实现
算法实现
// 基数排序,最高位优先法/*len_number:数字最长位数*/void sort_radixSort_MSD(int* arr, int len, int len_number, int mode){ // 创建头指针 SNode* arr_list = createSNode(-1); addSListToTheNext(arr_list, createList(arr, len));
// 记录头地址 SNode* arr_list_head = arr_list; SNode* node_tmp;
// 初始化关键码数组 Queue** digit_arr[10]; for(int i = 0; i < 10; i ++) digit_arr[i] = createQueue();
// 用来截取关键码 int flag = 1; int flag_tmp = 1;
// 存放关键码 int digit_tmp; while(flag_tmp++ <= len_number) { // 将数字按关键码排好 while(arr_list->next) { node_tmp = deleteNextSNode(arr_list); digit_tmp = node_tmp->value / flag % 10; queue_push(digit_arr[digit_tmp], node_tmp); }
// 按顺序从关键码数组中取出数据 for(int i = 0; i < 10; i ++) { while(node_tmp = queue_pop(digit_arr[mode? i : (9 - i)])) { addSNodeToTheNext(arr_list, node_tmp); arr_list = arr_list->next; } }
// 把地址重新赋值 arr_list = arr_list_head; flag *= 10; }
// 把相应的值赋给数组 for(int i = 0; i < len; i ++) { arr[i] = deleteNextSNode(arr_list)->value; }}运算结果
- 测试代码
#define N 10int main(){int arr[N] = {278,109,63,930,589,184,505,269,8,83};sort_radixSort_MSD(arr, N, 3, 1);utils_print_arr(arr,0, N-1, "%2d ","升序排列结果:\n", "\n\n");sort_radixSort_MSD(arr, N, 3, 0);utils_print_arr(arr,0, N-1, "%2d ", "降序排列结果:\n", "\n");return 0;}
- 运算结果

其他
原文链接:CSDN
基数排序-最低位优先法
https://blog.homura.work/posts/csdn/109499370/