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

JAVA十大排序算法之希爾排序詳解

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

希爾排序

一種基于插入排序的快速的排序算法。簡(jiǎn)單插入排序?qū)τ诖笠?guī)模亂序數(shù)組很慢,因?yàn)樵刂荒芤稽c(diǎn)一點(diǎn)地從數(shù)組的一端移動(dòng)到另一端。例如,如果主鍵最小的元素正好在數(shù)組的盡頭,要將它挪到正確的位置就需要n-1次移動(dòng)。

希爾排序?yàn)榱思涌焖俣群?jiǎn)單地改進(jìn)了插入排序,也稱為縮小增量排序。

希爾排序是把待排序數(shù)組按一定的數(shù)量分組,對(duì)每組使用直接插入排序算法排序;然后縮小數(shù)量繼續(xù)分組排序,隨著數(shù)量逐漸減少,每組包含的元素越來(lái)越多,當(dāng)數(shù)量減至 1 時(shí),整個(gè)數(shù)組恰被分成一組,排序便完成了。這個(gè)不斷縮小的數(shù)量,就構(gòu)成了一個(gè)增量序列,這里的數(shù)量稱為增量。

image-20210729135834646

代碼實(shí)現(xiàn)

public class ShellSort {

    public static final int[] ARRAY = {12, 9, 6, 11, 5, 1, 14, 2, 10, 4, 8, 7, 13, 3};

    public static int[] sort(int[] array) {
        int len = array.length;
        if (len < 2) {
            return array;
        }
        //當(dāng)前待排序數(shù)據(jù),該數(shù)據(jù)之前的已被排序
        int current;
        //增量
        int gap = len / 2;
        while (gap > 0) {
            for (int i = gap; i < len; i++) {
                current = array[i];
                //前面有序序列的索引
                int index = i - gap;
                while (index >= 0 && current < array[index]) {
                    array[index + gap] = array[index];
                    //有序序列的下一個(gè)
                    index -= gap;
                }
                //插入
                array[index + gap] = current;
            }
            //int相除取整
            gap = gap / 2;
        }
        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));
    }
}

時(shí)間復(fù)雜度

希爾排序的復(fù)雜度和增量序列有關(guān)。

在先前較大的增量下每個(gè)子序列的規(guī)模都不大,用直接插入排序效率都較高,盡管在隨后的增量遞減分組中子序列越來(lái)越大,由于整個(gè)序列的有序性也越來(lái)越明顯,則排序效率依然較高。

從理論上說(shuō),只要一個(gè)數(shù)組是遞減的,并且最后一個(gè)值是1,都可以作為增量序列使用。有沒(méi)有一個(gè)步長(zhǎng)序列,使得排序過(guò)程中所需的比較和移動(dòng)次數(shù)相對(duì)較少,并且無(wú)論待排序列記錄數(shù)有多少,算法的時(shí)間復(fù)雜度都能漸近最佳呢?但是目前從數(shù)學(xué)上來(lái)說(shuō),無(wú)法證明某個(gè)序列是最好的。

常用的增量序列:

  • 希爾增量序列 :{n/2, (n / 2)/2, …, 1},其中N為原始數(shù)組的長(zhǎng)度,這是最常用的序列,但卻不是最好的
  • Hibbard序列:{2k-1, …, 3,1}
  • Sedgewick序列:{… , 109 , 41 , 19 , 5,1} 表達(dá)式為9 * 4i- 9 * 2i + 1,i = 0,1,2,3,4…

算法穩(wěn)定性

由于多次插入排序,我們知道一次插入排序是穩(wěn)定的,不會(huì)改變相同元素的相對(duì)順序,但在不同的插入排序過(guò)程中,相同的元素可能在各自的插入排序中移動(dòng),如數(shù)組5,2,2,1,第一次排序第一個(gè)元素5會(huì)和第三個(gè)元素2交換,第二個(gè)元素2會(huì)和第四個(gè)元素1交換,原序列中兩個(gè)2的相對(duì)前后順序就被破壞了,所以希爾排序是一個(gè)不穩(wěn)定的排序算法。

image-20210729165300142

總結(jié)

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

相關(guān)文章

  • java實(shí)現(xiàn)可視化日歷

    java實(shí)現(xiàn)可視化日歷

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)可視化日歷,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Java gif圖片轉(zhuǎn)換為jpg格式

    Java gif圖片轉(zhuǎn)換為jpg格式

    這篇文章主要介紹了Java gif圖片轉(zhuǎn)換為jpg格式的實(shí)例代碼,文中給大家提到了用java將png圖片轉(zhuǎn)換成jpg格式的圖片,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot整合UEditor的示例代碼

    SpringBoot整合UEditor的示例代碼

    本篇文章主要介紹了SpringBoot整合UEditor的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 一文帶你搞懂Spring響應(yīng)式編程

    一文帶你搞懂Spring響應(yīng)式編程

    相信響應(yīng)式編程經(jīng)常會(huì)在各種地方被提到。本篇就為大家從函數(shù)式編程一直到Spring?WeFlux做一次簡(jiǎn)單的講解,并給出一些示例,希望大家可以更好的理解響應(yīng)式編程
    2022-07-07
  • 解決Spring Boot項(xiàng)目端口8080被占用的問(wèn)題

    解決Spring Boot項(xiàng)目端口8080被占用的問(wèn)題

    這篇文章主要介紹了解決Spring Boot項(xiàng)目端口8080被占用的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • JAVA深入探究之Method的Invoke方法

    JAVA深入探究之Method的Invoke方法

    這篇文章主要給大家介紹了關(guān)于JAVA深入探究之Method的Invoke方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 通過(guò)Java?Reflection實(shí)現(xiàn)編譯時(shí)注解正確處理方法

    通過(guò)Java?Reflection實(shí)現(xiàn)編譯時(shí)注解正確處理方法

    Java注解是一種標(biāo)記在JDK5及以后的版本中引入,用于Java語(yǔ)言中向程序添加元數(shù)據(jù)的方法,這篇文章主要介紹了通過(guò)Java?Reflection實(shí)現(xiàn)編譯時(shí)注解處理方法,需要的朋友可以參考下
    2023-06-06
  • Java 利用DeferredResult實(shí)現(xiàn)http輪詢實(shí)時(shí)返回?cái)?shù)據(jù)接口

    Java 利用DeferredResult實(shí)現(xiàn)http輪詢實(shí)時(shí)返回?cái)?shù)據(jù)接口

    這篇文章主要介紹了Java 利用 DeferredResult 實(shí)現(xiàn) http 輪詢實(shí)時(shí)返回?cái)?shù)據(jù)接口,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • 作為Java程序員應(yīng)該掌握的10項(xiàng)技能

    作為Java程序員應(yīng)該掌握的10項(xiàng)技能

    這篇文章主要介紹了作為Java程序員應(yīng)該掌握的10項(xiàng)技能,包括java的知識(shí)點(diǎn)與相關(guān)的技能,對(duì)于java的學(xué)習(xí)有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • Java中的 VO,BO,DO 對(duì)象命名問(wèn)題小結(jié)

    Java中的 VO,BO,DO 對(duì)象命名問(wèn)題小結(jié)

    本文講解VO,BO,DO 的作用以及如何使用,分析了如何消除三者之間重復(fù)的代碼,同樣結(jié)合現(xiàn)實(shí)生活中領(lǐng)導(dǎo)配秘書(shū)來(lái)類比講解,對(duì)Java  VO  對(duì)象命名相關(guān)知識(shí)感興趣的朋友一起看看吧
    2024-01-01

最新評(píng)論

汝州市| 永嘉县| 沛县| 杭锦后旗| 和平县| 高碑店市| 阳城县| 南陵县| 庆安县| 哈尔滨市| 日照市| 蒲城县| 赤城县| 白沙| 绥江县| 平南县| 海晏县| 托里县| 灵山县| 双鸭山市| 彰化市| 五原县| 华蓥市| 上犹县| 安新县| 鹤庆县| 响水县| 福泉市| 东明县| 宣城市| 工布江达县| 乾安县| 威远县| 柏乡县| 平度市| 乳源| 嘉峪关市| 九寨沟县| 梧州市| 岳西县| 隆回县|