基数排序

基于数组的基数排序

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;
    }
}

 

posted @ 2020-02-14 22:26  Angry-rookie  阅读(186)  评论(0)    收藏  举报