基數排序(使用隊列的方法)-JAVA語言實現

用隊列來實現基數排序。

       在之前的基數排序-JAVA語言實現一文中,採用數組來存儲每一個桶中的元素,然後將桶中的元素依次取出進行下一次的排序,由於這種操作方式是先進先出的順序,滿足隊列這種數據結構,因此,可以使用對列來作爲桶進行數據測存儲。

首先創建一個隊列類,來實現隊列的各種操作,隊列的各種操作詳情見順序隊列-JAVA語言實現一文。

public class SeqQueue {
    private int maxSize; // 表示數組的最大容量
    private int front; // 隊頭
    private int rear; // 隊尾
    private int[] arr; // 該數組用於存放數據, 模擬隊列

    // 隊列的構造器
    public SeqQueue(int maxSize) {
        front = -1; // 指向隊列頭部
        rear = -1; // 指向隊列尾
        this.maxSize = maxSize;
        arr = new int[maxSize];
    }

    // 判斷隊列是否滿
    public boolean isFull() {
        return rear == maxSize - 1;
    }

    // 判斷隊列是否爲空
    public boolean isEmpty() {
        return rear == front;
    }

    // 向隊列中添加數據
    public void addQueue(int n) {
        // 判斷隊列是否滿
        if (isFull()) {
            System.out.println("隊列滿,不能加入數據~");
            return;
        }
        rear++; // 讓rear 後移
        arr[rear] = n;
    }

    // 獲取隊列的數據, 出隊列
    public int getFrontQueue() {
        // 判斷隊列是否空
        if (isEmpty()) {
            // 通過拋出異常
            throw new RuntimeException("隊列空,不能取數據");
        }
        front++; // front後移
        return arr[front];

    }

    // 顯示隊列的所有數據
    public void showQueue() {
        if (isEmpty()) {
            System.out.println("隊列空的,沒有數據~~");
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.printf("arr[%d]=%d\n", i, arr[i]);
        }
    }

    // 顯示隊列的頭數據,不是取出數據
    public int headQueue() {
        // 判斷
        if (isEmpty()) {
            throw new RuntimeException("隊列空的,沒有數據~~");
        }
        return arr[front + 1];
    }
}

對基數排序-JAVA語言實現一文中的程序進行改進。 改進後的代碼如下所示:

import java.util.Arrays;

public class RadixQueueSort {
    public static void main(String[] args) {
        int[] arr = new int[]{0,879,78,56,4,15,23,11,47,22,100,468,418};
        System.out.println("排序之前:");
        System.out.println(Arrays.toString(arr));
        radixSort(arr);
        System.out.println("排序之後:");
        System.out.println(Arrays.toString(arr));
    }

    public 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];
            }
        }
        //計算最大數據的位數
        //先將整數轉化爲字符串,然後調用字符串長度函數
        int maxNumberLength = (max + "").length();
        //創建臨時隊列數組來存放數字
        SeqQueue[] temp = new SeqQueue[10];
        //爲隊列數組賦值
        for (int i = 0; i < temp.length; i++){
            temp[i] = new SeqQueue(arr.length + 1);
        }
        //根據最大數據的位數來決定比較次數
        for (int i = 0, n = 1; i < maxNumberLength; i++, n *= 10){
            //計算每個數字的餘數
            for (int j = 0; j < arr.length; j++){
                //取餘數
                int moduleNumber = arr[j]/n%10;
                //將當前遍歷的數字放入指定的隊列中
                temp[moduleNumber].addQueue(arr[j]);
            }
            //記錄取出的數字所放的位置
            int index = 0;
            //從隊列數組中把數字取出來
            for (int k = 0; k < temp.length; k++){
                //從隊列數組中取出數字
                while (!temp[k].isEmpty()){
                    //取出元素
                    arr[index] = temp[k].getFrontQueue();
                    //記錄下一個位置
                    index++;
                }
            }
        }
    }
}

對於這種包含兩個文件以上的程序時候,爲了測試方便,最好放在同一個工程目錄下面,方便導入相應的包。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章