基数排序
来源:互联网 发布:遗传算法bp神经网络 编辑:程序博客网 时间:2024/06/05 22:58
算法原理
基数排序(Radix Sort)用于数据长度相同的数据排序(若不相等,需要将数据补全),主要分为两类:最高位优先、最低位优先。
最高位优先(Most Significant Digit first)法,简称MSD法:先按K1排序分组,同一组中记录,关键码K1相等,再对各组按K2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。
最低位优先(Least Significant Digit first)法,简称LSD法:先从Kd开始排序,再对Kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。
显然LSD比较容易实现,只需不断递归调用基数排序即可,若要实现MSD,则递归函数将更加复杂。
Code
#include <iostream> //这里以LSD为例#include <memory.h>#include <stdio.h>using namespace std;const int Max = 10000;int radix[10][Max]; //分配"桶"int input[Max];int leg(int a){ int ans = 0; while(a) { a/=10; ans++; } return ans;}void radix_sort(int length,int max_length,int num){ if (length>max_length) return ; //直到length超过数据最大长度 memset(radix,0,sizeof(radix)); int n = 1; for (int i = 1;i<length;i++) n*=10; for (int i = 0;i<num;i++) { int tmp =(input[i]/n)%10; ++radix[tmp][0]; //radix[i][0]用于记录各"桶"中的数据个数 radix[tmp][radix[tmp][0]] = input[i]; } int index = 0; printf("%d:\n",length); for (int i = 0;i<=9;i++) //将各"桶"中数据以此存回到原数组中 for (int j = 1; j<=radix[i][0];j++) input[index++] = radix[i][j]; radix_sort(length+1,max_length,num);}int main(){ int N,m = 0; scanf("%d",&N); for (int i = 0;i<N;i++) { scanf("%d",&input[i]); m = (m<input[i])?input[i]:m; //记录最大数据 } int length = leg(m); //求数据最大长度 radix_sort(1,length,N); //递归调用基数排序 for (int i = 0;i<N;i++) if (i==0) printf("%d",input[i]); else printf(" %d",input[i]); printf("\n"); return 0;}
阅读全文
0 0
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 【Java开发工具】IntelliJ IDEA 快捷键和设置
- Python爬虫之爬取动态页面数据
- js零散知识
- 这是我个人的学习经验
- windows bat文件去掉请按任意键继续的文字
- 基数排序
- Vue2.0子同级组件之间数据交互
- spring简介
- LEDE+PPTP穿透
- adb 安装出现 Failure [INSTALL_FAILED_VERIFICATION_FAILURE] 的解决方法
- 如何防止ElasticSearch集群出现脑裂现象
- 题目要求:根据持卡人不同操作,显示不同信息。当借书操作后,显示本次借书数及已借书数;当还书操作时,显示本次还书数和已借书数。
- Oracle日常记录
- 设计模式学习二、模板方法模式