排序算法-----計數排序

計數排序不是基於比較的排序算法,其核心在於將輸入的數據值轉化爲鍵存儲在額外開闢的數組空間中,作爲一種線性時間複雜度的排序,計數排序要求輸入的數據必須是有確定範圍的整數。
時間複雜度:O(n+m)
空間複雜度:O(n+m)
穩定性:穩定

在這裏插入圖片描述
在這裏插入圖片描述

package 排序算法;

import java.util.Arrays;
import java.util.Random;

public class CountingSort {
    public static void main(String[] args) {
        int []arr=new int[20];
        Random random=new Random();
        for (int i=0;i<arr.length;i++){
            arr[i]=random.nextInt(50);
        }
        countingSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    private static void countingSort(int[] arr) {
        //1.獲取最大值和最小值
        int max=arr[0];
        int min=arr[0];
        for (int i=1;i<arr.length;i++){
            if(arr[i]>max){
                max=arr[i];
            }
            if(arr[i]<min){
                min=arr[i];
            }
        }
        //2.創建輔助數組
        int [] temp=new int [max-min+1];
        int offset=min-0;
        //3.遍歷原數組,將數字的個數統計在新數組中
        for(int i=0;i<arr.length;i++){
           temp[ arr[i]-offset]++;
        }
        //4.遍歷新數組temp,將統計結果處理
        int index=0;
        for(int i=0;i<temp.length;i++){
            if (temp[i]!=0){
                for(int j=0;j<temp[i];j++){
                    arr[index++]=i+offset;
                }
            }
        }

    }


}

執行結果

[4, 4, 7, 8, 16, 18, 19, 24, 25, 26, 28, 31, 35, 37, 39, 40, 42, 46, 48, 49]

測試

package 排序算法;

import java.util.Arrays;
import java.util.Random;

public class TestSort {
    /*
    數據分佈情況
    1.完全隨機
    2.大致有序
    3.方差小
     */
    public static int[] getTotalRandom(){
        Random random=new Random();
        int [] arr=new int[40000];
        for (int i=0;i<arr.length;i++){
            arr[i]=random.nextInt(10000);
        }
        return arr;
    }

    public static void main(String[] args) {
        int [] arr1=getTotalRandom();
        int [] arr2= Arrays.copyOf(arr1, arr1.length);
        int [] arr3= Arrays.copyOf(arr1, arr1.length);
        int [] arr4= Arrays.copyOf(arr1, arr1.length);
        int [] arr5= Arrays.copyOf(arr1, arr1.length);
        int [] arr6= Arrays.copyOf(arr1, arr1.length);
        int [] arr7= Arrays.copyOf(arr1, arr1.length);
        int [] arr8= Arrays.copyOf(arr1, arr1.length);
        int [] arr9= Arrays.copyOf(arr1, arr1.length);
        int [] arr10= Arrays.copyOf(arr1, arr1.length);
       /* testSelectionSort(arr1);
        testBubbleSort(arr2);
        testInsertSort(arr3);
        testShellSort(arr4);
        testMergSort(arr5);
        testHeapSort(arr6);*/
        testQuickSort01(arr7);
        testQuickSort02(arr8);
        testQuickSort09(arr9);
        testCounting(arr10);


    }

    private static void testCounting(int[] arr10) {
        long startTime=System.currentTimeMillis();
        CountingSort.countingSort(arr10);
        long endTime=System.currentTimeMillis();
        System.out.println("計數排序"+(endTime-startTime));

    }

    private static void testQuickSort09(int[] arr9) {
        long startTime=System.currentTimeMillis();
        QuickSort03.quickSort03(arr9,0,arr9.length-1);
        long endTime=System.currentTimeMillis();
        System.out.println("三路快排"+(endTime-startTime));
    }

    private static void testQuickSort02(int[] arr8) {
        long startTime=System.currentTimeMillis();
        QuickSort02.quickSort02(arr8,0,arr8.length-1);
        long endTime=System.currentTimeMillis();
        System.out.println("雙路快排"+(endTime-startTime));

    }

    private static void testQuickSort01(int[] arr7) {
        long startTime=System.currentTimeMillis();
        QuickSort01.quickSort(arr7,0,arr7.length-1);
        long endTime=System.currentTimeMillis();
        System.out.println("單路快排"+(endTime-startTime));
    }

    private static void testHeapSort(int[] arr6) {
            long startTime=System.currentTimeMillis();
            HeapSort.heapSort(arr6);
            long endTime=System.currentTimeMillis();
            System.out.println("堆排序"+(endTime-startTime));
    }

    private static void testInsertSort(int[] arr3) {
        long startTime=System.currentTimeMillis();
        BubbleSort.bubbleSort(arr3);
        long endTime=System.currentTimeMillis();
        System.out.println("冒泡排序"+(endTime-startTime));
    }

    private static void testBubbleSort(int[] arr2) {
        long startTime=System.currentTimeMillis();
        insertionSort.lnsertionSortUpper(arr2);
        long endTime=System.currentTimeMillis();
        System.out.println("插入排序"+(endTime-startTime));
    }

    private static void testSelectionSort(int[] arr) {
        long startTime=System.currentTimeMillis();
        SelectionSort.selectionSort(arr);
        long endTime=System.currentTimeMillis();
        System.out.println("選擇排序"+(endTime-startTime));
    }
    private static void testShellSort(int[] arr) {
        long startTime=System.currentTimeMillis();
        ShellSort.shellSort(arr);
        long endTime=System.currentTimeMillis();
        System.out.println("希爾排序"+(endTime-startTime));
    }
    private static void testMergSort(int[] arr) {
        long startTime=System.currentTimeMillis();
        MergSort.mergSort(arr,0,arr.length-1);
        long endTime=System.currentTimeMillis();
        System.out.println("歸併排序"+(endTime-startTime));
    }

}

執行結果

單路快排38
雙路快排12
三路快排11
計數排序4

犧牲空間換時間

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