最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA十大排序算法之計數(shù)排序詳解

 更新時間:2021年08月23日 10:50:34   作者:阿粵Ayue  
這篇文章主要介紹了java中的計數(shù)排序,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

計數(shù)排序

一種非比較排序。計數(shù)排序?qū)σ欢ǚ秶鷥?nèi)的整數(shù)排序時候的速度非常快,一般快于其他排序算法。但計數(shù)排序局限性比較大,只限于對整數(shù)進行排序,而且待排序元素值分布較連續(xù)、跨度小的情況。

如果一個數(shù)組里所有元素都是整數(shù),而且都在0-k以內(nèi)。對于數(shù)組里每個元素來說,如果能知道數(shù)組里有多少項小于或等于該元素,就能準(zhǔn)確地給出該元素在排序后的數(shù)組的位置。

如給定一個0~5范圍內(nèi)的數(shù)組[2,5,3,0,2,3,0,3],對于元素5為其中最大的元素,創(chuàng)建一個大小為(5-0+1 = 6)的計數(shù)數(shù)組,如果原數(shù)組中的值對應(yīng)計數(shù)數(shù)組的下標(biāo),則下標(biāo)對應(yīng)計數(shù)數(shù)組的值加1。

image-20210806112939098

問題

上面是通過數(shù)組的最大值來確定計數(shù)數(shù)組的長度的,但如果需要對學(xué)生的成績進行排序,如學(xué)生成績?yōu)椋篬95,93,92,94,92,93,95,90],如果按照上面的方法來處理,則需要一個大小為100的數(shù)組,但是可以看到其中的最小值為90,那也就是說前面 0~89 的位置都沒有數(shù)據(jù)存放,造成了資源浪費。

如果我們知道了數(shù)組的最大值和最小值,則計數(shù)數(shù)組的大小為(最大值 - 最小值 + 1),如上面數(shù)組的最大值為99,最小值為90,則定義計數(shù)數(shù)組的大小為(95 - 90 + 1 = 6)。并且索引分別對應(yīng)原數(shù)組9095的值。我們把090的范圍用一個偏移量來表示,即最小值90就是這個偏移量。

image-20210806121018728

代碼實現(xiàn)

public class CountSort {
    public static final int[] ARRAY = {2, 5, 3, 0, 2, 3, 0, 3};
    public static final int[] ARRAY2 = {95,93,92,94,92,93,95,90};
    //優(yōu)化前
    private static int[] sort(int[] array) {
        if (array.length < 2) return array;
        //找出數(shù)組的最大值
        int max = array[0];
        for (int i : array) {
            if (i > max) {
                max = i;
            }
        }
        //初始化一個計數(shù)數(shù)組且值為0
        int[] countArray = new int[max + 1];
        for (int i = 0; i < countArray.length; i++) {
            countArray[i] = 0;
        }
        //填充計數(shù)數(shù)組
        for (int temp : array) {
            countArray[temp]++;
        }
        int o_index = 0;//原數(shù)組下標(biāo)
        int n_index = 0;//計數(shù)數(shù)組下標(biāo)
        while (o_index < array.length) {
            //只要計數(shù)數(shù)組的下標(biāo)不為0,就將計數(shù)數(shù)組的值從新寫回原數(shù)組
            if (countArray[n_index] != 0) {
                array[o_index] = n_index;//計數(shù)數(shù)組下標(biāo)對應(yīng)元素組的值
                countArray[n_index]--;//計數(shù)數(shù)組的值要-1
                o_index++;
            } else {
                n_index++;//上一個索引的值為0后開始下一個
            }
        }
        return array;
    }
    //優(yōu)化后
    private static int[] sort2(int[] array) {
        if (array.length < 2) return array;
        //找出數(shù)組中的最大值和最小值
        int min = array[0], max = array[0];
        for (int i : array) {
            if (i > max) {
                max = i;
            }
            if (i < min) {
                min = i;
            }
        }
        //定義一個偏移量,即最小值前面0~min的范圍,這里直接用一個負數(shù)來表示
        int bias = 0 - min;
        //初始化一個計數(shù)數(shù)組且值為0
        int[] countArray = new int[max - min + 1];
        for (int i = 0; i < countArray.length; i++) {
            countArray[i] = 0;
        }
        for (int temp : array) {
            countArray[temp + bias]++;
        }
        //填充計數(shù)數(shù)組
        int o_index = 0;//原數(shù)組下標(biāo)
        int n_index = 0;//計數(shù)數(shù)組下標(biāo)
        while (o_index < array.length) {
            if (countArray[n_index] != 0) {
                array[o_index] = n_index - bias;
                countArray[n_index]--;
                o_index++;
            } else {
                n_index++;
            }
        }
        return array;
    }
    public static void print(int[] array) {
        for (int i : array) {
            System.out.print(i + "  ");
        }
        System.out.println("");
    }
    public static void main(String[] args) {
        print(ARRAY);
        System.out.println("============================================");
        print(sort(ARRAY));
        System.out.println("=================優(yōu)化排序====================");
        print(ARRAY2);
        System.out.println("============================================");
        print(sort2(ARRAY2));
    }
}

時間復(fù)雜度

很明顯,在排序過程中,我們至少遍歷了三次原始數(shù)組,一次計數(shù)數(shù)組,所以它的復(fù)雜度為Ο(n+m)。因此,計數(shù)排序比任何排序都要塊,這是一種犧牲空間換取時間的做法,因為排序過程中需要用一個計數(shù)數(shù)組來存元素組的出現(xiàn)次數(shù)。

算法穩(wěn)定性

在新建的計數(shù)數(shù)組中記錄原始數(shù)組中每個元素的數(shù)量,如果原始數(shù)組有相同的元素,則在輸出時,無法保證元素原來的排序,是一種不穩(wěn)定的排序算法。

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 基于Java?SpringBoot的前后端分離信息管理系統(tǒng)的設(shè)計和實現(xiàn)

    基于Java?SpringBoot的前后端分離信息管理系統(tǒng)的設(shè)計和實現(xiàn)

    當(dāng)今社會,人才的流動速度大大增加,因此也對黨建工作的管理層面工作帶來了空前且復(fù)雜的挑戰(zhàn),從而使得如何高效的開展管理黨建工作成為了亟待解決的問題。本文將介紹通過Java?SpringBoot實現(xiàn)前后端分離信息管理系統(tǒng),感興趣的同學(xué)可以了解一下
    2021-11-11
  • Java類加載器與雙親委派機制和線程上下文類加載器專項解讀分析

    Java類加載器與雙親委派機制和線程上下文類加載器專項解讀分析

    類加載器負責(zé)讀取Java字節(jié)代碼,并轉(zhuǎn)換成java.lang.Class類的一個實例的代碼模塊。本文主要和大家聊聊JVM類加載器ClassLoader的使用,需要的可以了解一下
    2022-12-12
  • SpringBoot調(diào)用WebService接口方法示例代碼

    SpringBoot調(diào)用WebService接口方法示例代碼

    這篇文章主要介紹了使用SpringWebServices調(diào)用SOAP?WebService接口的步驟,包括導(dǎo)入依賴、創(chuàng)建請求類和響應(yīng)類、生成ObjectFactory類、配置WebServiceTemplate、調(diào)用WebService接口以及測試代碼,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • IDEA 創(chuàng)建一個Mybatis Maven項目的方法步驟(圖文)

    IDEA 創(chuàng)建一個Mybatis Maven項目的方法步驟(圖文)

    這篇文章主要介紹了IDEA 創(chuàng)建一個Mybatis Maven項目的方法步驟(圖文),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Spring security BCryptPasswordEncoder密碼驗證原理詳解

    Spring security BCryptPasswordEncoder密碼驗證原理詳解

    這篇文章主要介紹了Spring security BCryptPasswordEncoder密碼驗證原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • springcloud注冊hostname或者ip的那些事

    springcloud注冊hostname或者ip的那些事

    Spring cloud是一個基于Spring Boot實現(xiàn)的服務(wù)治理工具包,在微服務(wù)架構(gòu)中用于管理和協(xié)調(diào)服務(wù)的。這篇文章主要介紹了springcloud注冊hostname或者ip,需要的朋友可以參考下
    2019-11-11
  • IDEA創(chuàng)建SpringBoot父子Module項目的實現(xiàn)

    IDEA創(chuàng)建SpringBoot父子Module項目的實現(xiàn)

    本文主要介紹了IDEA創(chuàng)建SpringBoot父子Module項目的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • JDK1.8使用的垃圾回收器和執(zhí)行GC的時長以及GC的頻率方式

    JDK1.8使用的垃圾回收器和執(zhí)行GC的時長以及GC的頻率方式

    這篇文章主要介紹了JDK1.8使用的垃圾回收器和執(zhí)行GC的時長以及GC的頻率方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • redisson 實現(xiàn)分布式鎖的源碼解析

    redisson 實現(xiàn)分布式鎖的源碼解析

    這篇文章主要介紹了redisson 實現(xiàn)分布式鎖的源碼解析,通過模擬一個商品秒殺的場景結(jié)合示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 一文掌握Java中的JWT

    一文掌握Java中的JWT

    這篇文章主要介紹了Java中的JWT,JWT的本質(zhì)就是一個字符串,它是將用戶信息保存到一個Json字符串中,然后進行編碼后得到一個JWT?token,對JWT相關(guān)知識感興趣的朋友一起看看吧
    2022-06-06

最新評論

普兰店市| 农安县| 花莲市| 德保县| 西昌市| 南安市| 乌兰浩特市| 长阳| 汽车| 灯塔市| 宾阳县| 宁波市| 大厂| 邵阳县| 霍州市| 文山县| 德兴市| 浦江县| 宝鸡市| 平南县| 洪雅县| 桃园市| 丰都县| 金秀| 额尔古纳市| 英吉沙县| 抚松县| 平罗县| 丰镇市| 永和县| 安义县| 天津市| 图木舒克市| 阳春市| 宁明县| 冷水江市| 乡宁县| 永平县| 河曲县| 衡南县| 甘孜|