排序算法之基数排序
来源:互联网 发布:python turtle函数 编辑:程序博客网 时间:2024/05/05 01:41
概述
首先从多排序码排序开始介绍基数排序。以扑克牌排序为例。每张扑克牌有两个“排序码”:花色和面值。其有序关系为:
- 花色:
♣<♦<♥<♠ - 面值:
2<3<4<5<6<7<8<9<10<J<Q<K<A
如果把所有扑克牌排成以下次序:
♣2,…,♣A,♦2,…,♦A,♥2,…,♥A,♠2,…,♠A
这就是多排序码排序。排序后形成的有序序列叫做字典有序序列。
一般情况下,假定有一个n个元素的序列
实现多排序码排序有两种常用的方法:一种方法是最高位优先(Most Significant Digit first,MSD),一种方法是最低位优先(Least Significant Digit first,LSD)。
MSD基数排序
基本思想
首先根据最高位关键码
代码
private int radix = 10;//基数,默认十进制private void msdRadixSort(int[] a, int left, int right, int d) { int[] auxArray = new int[a.length];// 辅助数组,存放按桶分配的结果,根据count[]预先算定各桶元素的使用位置 int[] count = new int[right-left+1];// 辅助数组,记录当处理第i位时各个元素的第i位取值为k的有多少个。 int i, j; if (d > 0) {//位数尚未处理完 //初始化count数组 for (i = 0; i < radix; i++) count[i] = 0; //统计各桶元素的个数 for (i = left; i <= right; i++) count[getDigit(a[i], d)]++; //计算各桶元素的存放位置 for (i = 1; i < radix; i++) count[i] = count[i] + count[i - 1]; //将待排序列中的元素按位值分配到各个桶中,存于辅助数组auxArray中 for (i = left; i <= right; i++) { j = getDigit(a[i], d); //取元素a[i]第d位的值 auxArray[count[j] - 1] = a[i]; //按预先计算位置存放 count[j]--; //计数器减1 } //从辅助数组顺序写入原数组 for (i = left, j = 0; i <= right; i++, j++) a[i] = auxArray[j]; //按桶递归对d-1位处理 for (j = 0; j < radix - 1; j++) { int p1 = count[j]; //取桶开始端 int p2 = count[j + 1] - 1; //取桶结束端 if (p1 < p2 && d > 1) msdRadixSort(a, p1, p2, d - 1);//对桶内元素进行基数排序 } }}
LSD基数排序
基本思想
首先依据最低位排序码
代码
private void lsdRadixSort(int[] a, int left, int right, int d) { int[] auxArray = new int[a.length];// 辅助数组,存放按桶分配的结果,根据count[]预先算定各桶元素的使用位置 int[] count = new int[right-left+1];// 辅助数组,记录当处理第i位时各个元素的第i位取值为k的有多少个。 int i, j, k; for (k = 1; k <= d; k++) { for (i = 0; i < radix; i++) count[i] = 0; for (i = left; i <= right; i++) count[getDigit(a[i], k)]++; for (i = 1; i < radix; i++) count[i] = count[i] + count[i - 1]; for (i = left; i <= right; i++) { j = getDigit(a[i], k); auxArray[count[j] - 1] = a[i]; count[j]--; } // 从辅助数组顺序写入原数组 for (i = left, j = 0; i <= right; i++, j++) a[i] = auxArray[j]; }}
0 0
- 排序算法之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 【排序算法】之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 排序算法之基数排序
- 算法 排序算法之基数排序
- 排序算法之基数排序(JAVA)
- 排序算法大全之基数排序
- python2 unicode str
- hadoop SSH协议
- [cocos2dx]抽象元素——CCScene场景类
- 不要轻易许诺
- [Android]自定义Toast
- 排序算法之基数排序
- Sitemesh 3 的使用及配置
- Leetcode-Implement Queue using Stacks(C++)
- Python赋值--序列解包
- 让世界一下变大—MMU
- 事件处理
- 数据挖掘比赛入门_以去年阿里天猫推荐比赛为例
- SiteMesh使用示例
- Content Transitions In-Depth (part 2)