基数排序
基于数组的基数排序
package com.zhao.algorithm.sort; import java.util.Arrays; /** * AUTHOR :zhao * 日期:2020/2/14 20:41 * 基数排序,对数字的个 十 百。。。取余进行排序 */ public class RadixSort { public static void main(String[] args) { int[] arr={7,8,89,422,451}; radixSort(arr); System.out.println(Arrays.toString(arr)); } /** * 基数排序 排序的次数取决于数组中的最大值 * @param arr 要排序的数组 */ static void radixSort(int[]arr){ //求出数组中的最大值 int max=Integer.MIN_VALUE; for (int i = 0; i <arr.length ; i++) { if(arr[i]>max) max = arr[i]; } // System.out.println(max); //定义存取取余之后的数字 10代表0-9的基数 arr.length 代表每个技术组中最多存的元素 int temp[][]=new int[10][arr.length]; //定义一个记录每个基数组中所存数字个数 因为基数就10个 0-9 int[] counts = new int[10]; //获取最大数字的位数 int maxLen=(max+"").length(); //maxLen 决定要排几次序 for (int k = 0,n=1; k <maxLen ; k++,n*=10) { //取模求出基数 for (int p = 0; p <arr.length ; p++) { //获取该数字的基数 int sr=arr[p]/n%10; //counts[sr] 这个基数组 初始值是0 进去一个 counts[sr]++ temp[sr][counts[sr]]=arr[p]; counts[sr]++; } // if(k==0){ // for (int [] u:temp) { // System.out.println("--"+Arrays.toString(u)); // } // } //记录原数组下标 int index=0; //取出存入的数字放入原数组 for (int l = 0; l <counts.length ; l++) { //计入记录的数组当前值不为0 if (counts[l]!=0){ //循环取出数字 for (int o = 0; o < counts[l]; o++) { arr[index++]=temp[l][o]; } //将记录变为0 counts[l]=0; } } //这里可以不清空,赋值覆盖之气那的数组就行了,不过数据不好查看 // temp=new int[10][arr.length]; } } }
基于队列的基数排序
package com.zhao.algorithm.sort; import com.zhao.algorithm.MyQueue; import java.util.Arrays; /** * AUTHOR :zhao * 日期:2020/2/14 20:41 * 基数排序,对数字的个 十 百。。。取余进行排序 */ public class RadixQueueSort { public static void main(String[] args) { int[] arr={45,8,89,422,451}; radixSort(arr); System.out.println(Arrays.toString(arr)); } /** * 基数排序 排序的次数取决于数组中的最大值 * @param arr 要排序的数组 */ static void radixSort(int[]arr){ //求出数组中的最大值 int max=Integer.MIN_VALUE; for (int i = 0; i <arr.length ; i++) { if(arr[i]>max) max = arr[i]; } // System.out.println(max); //定义存取取余之后的数字 10代表0-9的基数 arr.length 代表每个技术组中最多存的元素 //使用队列存储临时元素 MyQueue[] queue=new MyQueue[10]; for (int i = 0; i < queue.length; i++) { queue[i]=new MyQueue(); } //获取最大数字的位数 int maxLen=(max+"").length(); //maxLen 决定要排几次序 for (int k = 0,n=1; k <maxLen ; k++,n*=10) { //取模求出基数 for (int p = 0; p <arr.length ; p++) { //获取该数字的基数 int sr=arr[p]/n%10; //把当前遍历的数据放入指定的队列中 queue[sr].add(arr[p]); } //记录取的元素需要放的位置 int index=0; //取出存入的数字放入原数组 for (int l = 0; l <queue.length ; l++) { //循环取出元素 if (!queue[l].isEmpty()){ while (!queue[l].isEmpty()){ arr[index++]= queue[l].poll(); } } } } } }
队列实现代码
package com.zhao.algorithm; import javax.swing.plaf.PanelUI; /** * AUTHOR :zhao * 日期:2020/2/14 21:45 * 使用数组实现队列 */ public class MyQueue { int[] elements; public MyQueue(){ elements = new int[0]; } //入队 public void add(int element){ int[] newArr=new int[elements.length+1]; for (int i = 0; i < elements.length; i++) { newArr[i]=elements[i]; } // 把添加的元素放入新数组中 newArr[elements.length]=element; elements=newArr; } //出队 public int poll() { //把数组中的第0个元素取出来 int element = elements[0]; int[] newArr=new int[elements.length-1]; for (int i = 0; i < newArr.length; i++) { newArr[i]=elements[i+1]; } //替换数组 elements=newArr; return element; } //判断队列是否为空 public boolean isEmpty() { return elements.length==0; } }

浙公网安备 33010602011771号