算法导论学习笔记——基数排序
2011-08-10 23:43
281 查看
/** * 基数排序:n个d位数进行排序,先从最低有效位进行,由于每位数字都界于0到9(只考虑整数), * 可以用计数排序对每一位进行排序,重复这一过程直到对所有的d位数字都进行了排序。 * 由于计数排序的复杂度为O(n+k),所以基数排序的时间复杂度为O(d(n+k)) */ public class RadixSort { /** * 用计数排序将arr数组按第i位排序 * @param arr 要排序的数组 * @param i 第i位 */ static void countingSort(int arr[],int i){ //存放arr中每个元素第i位的值 int a[] = new int[arr.length]; //b数组存放arr中现在的值,把排序结果放在 arr数组中 int b[] = new int[arr.length]; //c存储从0到9每个元素在a中出现的次数,故c的长度为10。 int c[] = new int[10]; //把arr中的元素放到b数组中 for(int j = 0;j<arr.length;j++){ b[j] = arr[j]; } //计算每个元素第i位的值,然后放入a数组中 for(int j = 0;j<b.length;j++){ int temp = (int)Math.pow(10, i); int r = b[j]%temp; if(i>1){ int x = (int)Math.pow(10, (i-1)); r=r/x; } a[j]=r; } //c[j]中存放了等于j的元素的个数 for(int j = 0;j<a.length;j++){ c[a[j]]++; } //c[j]存放小于或等于j的元素个数 for(int j = 1;j<10;j++){ c[j]+=c[j-1]; } //由于c[r]存放小于等于r的元素个数(r=a[j]),所以r应该放在arr数组中的c[r]位置(由于数组从0开始,所以要减1) for(int j = a.length-1;j>=0;j--){ int r = a[j]; arr[c[r]-1] = b[j]; //每次c[r]减1可以保证下一个等于r的相同元素,落在arr[c[r]-1]的前一个位置 c[r]--; } } /** * 外层排序算法,从最低有效位到d有效位,逐位进行排序 * @param arr 数组 * @param d d代表 每个数是几位数 */ static void radixSort(int arr[],int d){ for(int i = 1;i<=d;i++) countingSort(arr,i); } //测试..... public static void main(String args[]){ int arr[] = {329,457,657,839,436,720,355}; radixSort(arr,3); for(int i = 0;i<arr.length;i++) System.out.println(arr[i]); } }
相关文章推荐
- 最优二叉查找树详解(算法导论学习笔记)
- 【算法导论学习笔记】第1章:算法在计算中的作用
- 算法导论--第六章学习笔记
- Introduction to Algorithms 算法导论 第2章 算法入门 学习笔记及习题解答
- 一个菜鸟的算法导论学习笔记【Chapter 3】
- 麻省理工算法导论学习笔记(3)----分治法
- 算法导论学习笔记 一 分治算法
- 算法导论 学习笔记 第五章 概率分析和随机化算法
- 【算法导论】学习笔记——第6章 堆排序
- 【算法导论】学习笔记——第10章 基本数据结构
- 中位数和顺序统计量---算法导论学习笔记
- 【算法导论】学习笔记——第16章 贪心算法
- 【算法导论】学习笔记第一章:算法在计算中的作用
- 麻省理工算法导论学习笔记(5)----线性时间排序
- 算法导论学习笔记(十三):动态规划(三):01背包问题
- 算法导论学习笔记-第九章-中位数和顺序统计学
- 算法导论学习笔记-第十一章-散列表
- 算法导论学习笔记(2)-归并排序
- 算法导论学习笔记-第五章-概率分析和随机算法
- 基础知识 第一部分 算法导论 学习笔记