国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

七大排序算法——希爾排序,通俗易懂的思路講解與圖解(完整Java代碼)

這篇具有很好參考價值的文章主要介紹了七大排序算法——希爾排序,通俗易懂的思路講解與圖解(完整Java代碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


一、排序的概念

排序的概念

排序:所謂排序,就是使一串記錄,按照其中的某個或某些關(guān)鍵字的大小,遞增或遞減的排列起來的操作。

排序的穩(wěn)定性

java 希爾排序,Java算法,排序算法,java,算法
上述待排序的數(shù)中,有兩個5。 將前面的5標記一個a, 將后面的5標記一個b。

通過算法進行排序后,這一組數(shù)就有序了, 但是要看兩個相同的5的位置是否有改變。
5a仍在5b前面,那么這個排序算法就是穩(wěn)定的 ,
5a跑到了5b后面,那么這個排序算法就是不穩(wěn)定的 。

一個穩(wěn)定的排序算法可以做到不穩(wěn)定,
不穩(wěn)定的排序算法一定做不到穩(wěn)定。


至于為什么要討論這個穩(wěn)定性, 是為了以后應(yīng)用到實際場景上。 比如,一場數(shù)學(xué)考試, 假設(shè)a用了30分鐘做完了,并得了滿分。
假設(shè)b用了一個小時做完了,并得了滿分。 此時a與b都是得了滿分,但是用的時間不一樣,所以兩個人的排名又會有所不同。


七大排序算法

java 希爾排序,Java算法,排序算法,java,算法


二、希爾排序

核心思想

基本思想希爾排序法又稱縮小增量法。希爾排序法的基本思想是:

先選定一個整數(shù),把待排序文件中所有記錄分成多個組。
所有距離為的記錄分在同一組內(nèi),并對每一組內(nèi)的記錄進行直接插入排序。
然后,取,重復(fù)上述分組和排序的工作。
當?shù)竭_=1時,所有記錄在統(tǒng)一組內(nèi)排好序。


圖解

有一組待排序數(shù)列,我們進行升序排序。java 希爾排序,Java算法,排序算法,java,算法
排序過程:java 希爾排序,Java算法,排序算法,java,算法
說白了就是,將這些數(shù)分為幾個組,這幾個組再分別直接插入排序,然后分的組數(shù)減少,重復(fù)上述過程,直到只剩1組時,再對這個組排序,就完成了排序。

組數(shù)多則每組的數(shù)據(jù)少,組數(shù)少則每組的數(shù)據(jù)多。


代碼實現(xiàn)

代碼實現(xiàn)

public class ShellSort {
    /**
     * 希爾排序
     * 時間復(fù)雜度:O(n^1.3) - O(n^1.5)
     * 空間復(fù)雜度:O(1)
     * 穩(wěn)定性:不穩(wěn)定
     * @param array
     */
    public static void shell(int[] array) {
        // 組數(shù)
        int gap = array.length;
        while (gap > 1) {
            // gap組數(shù)變換比較隨意,
            // gap /= 3;也可以
            gap /= 2;
            shell(array,gap);
        }
        // 最后讓組數(shù)為1再排序一次
        shell(array,1);
    }
    public static void shell(int[] array,int gap) {
        for (int i = gap; i < array.length; i++) {
            // 默認每組內(nèi)第一個數(shù)據(jù)都是有序的,
            // 從每組的第二個數(shù)據(jù)開始進行直接插入排序
            // i++即是跳到下一組,
            // 每組排序一個數(shù),然后跳到下一組,如此循環(huán)。
            int tmp = array[i];
            int j = i - gap;
            
            // 跳躍式的組內(nèi)直接插入排序
            for (; j >= 0 ; j-=gap) {
                if(array[j] > tmp) {
                    array[j+gap] = array[j];
                } else {
                    break;
                }
            }
            array[j + gap] = tmp;
        }
    }
}

三、性能分析

希爾排序的特性總結(jié):
希爾排序是對直接插入排序的優(yōu)化。直接插入排序的特定就是數(shù)據(jù)越有序,速度越快。

當gap > 1時都是預(yù)排序,目的是讓數(shù)組更接近于有序。當gap == 1時,數(shù)組已經(jīng)接近有序的了,這樣就會很快。這樣整體而言,可以達到優(yōu)化的效果。我們實現(xiàn)后可以進行性能測試的對比。


時間復(fù)雜度:
希爾排序的時間復(fù)雜度不好計算,因為gap的取值方法很多,導(dǎo)致很難去計算,因此在好些樹中給出的希爾排序的時間復(fù)雜度都不固定: 有學(xué)者通過大量的試驗統(tǒng)計,得出結(jié)果為:O(n1.25) - O(1.6*n1.25)


空間復(fù)雜度:O(1)

穩(wěn)定性:
不相鄰的元素也會進行位置交換,是不穩(wěn)定。


四、七大排序算法性能對比

java 希爾排序,Java算法,排序算法,java,算法

想學(xué)哪個點哪個
歸并排序講解
快速排序講解
直接插入排序講解
希爾排序講解
直接選擇排序講解
堆排序講解
冒泡排序講解文章來源地址http://www.zghlxwxcb.cn/news/detail-777882.html

到了這里,關(guān)于七大排序算法——希爾排序,通俗易懂的思路講解與圖解(完整Java代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包