国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

希爾排序

LeanCloud / 2952人閱讀

摘要:概述希爾排序的誕生是由于插入排序在處理大規(guī)模數(shù)組的時(shí)候會遇到需要移動太多元素的問題,也稱遞減增量排序算法。希爾排序的思想是將一個大的數(shù)組分而治之,劃分為若干個小的數(shù)組,然后分別對劃分出來的數(shù)組進(jìn)行插入排序。

概述

希爾排序的誕生是由于插入排序在處理大規(guī)模數(shù)組的時(shí)候會遇到需要移動太多元素的問題,也稱遞減增量排序算法。希爾排序的思想是將一個大的數(shù)組“分而治之”,劃分為若干個小的數(shù)組,然后分別對劃分出來的數(shù)組進(jìn)行插入排序。

希爾排序是基于插入排序的以下兩點(diǎn)性質(zhì)而提出改進(jìn)方法的:

插入排序在對幾乎已經(jīng)排好序的數(shù)據(jù)操作時(shí), 效率高, 即可以達(dá)到線性排序的效率

但插入排序一般來說是低效的, 因?yàn)椴迦肱判蛎看沃荒軐?shù)據(jù)移動一位

效果示意圖:

至于如何提高效率的,我們還是看下面的實(shí)例吧。

步驟

取增量,一般取數(shù)組長度/2

按增量取得一個子數(shù)列,對子數(shù)列按插入排序的方式處理

將增量遞減,重復(fù)1,2步驟

直至增量為為0,數(shù)列已經(jīng)排好序

實(shí)例

原始數(shù)據(jù):

3 5 2 6 2

5/2=2作為增量,對[3 2 2]進(jìn)行插入排序,得到

2 5 2 6 3

增量遞減2/2=1,對[2 5 2 6 3]進(jìn)行插入排序,得到

2 2 3 5 6

增量遞減為0,排序結(jié)束。

代碼實(shí)現(xiàn)(Java)
package com.coder4j.main.arithmetic.sorting;
    
public class Shell {
    
    /**
     * 希爾排序
     * 
     * @param array
     * @return
     */
    public static int[] sort(int[] array) {
        int step = array.length / 2;
        while (step >= 1) {
            for (int i = step; i < array.length; i++) {
                int temp = array[i];
                int j;
                for (j = i - step; j >= 0 && temp < array[j]; j-=step) {
                    array[j + step] = array[j];
                }
                array[j + step] = temp;
            }
            System.out.println("增量為:" + step + ",結(jié)果:");
            for (int k : array) {
                System.out.print(k + " ");
            }
            System.out.println();
            step /= 2;
        }
        return array;
    }

    public static void main(String[] args) {
        int[] array = { 3, 5, 2, 6, 2 };
        int[] sorted = sort(array);
        System.out.println("最終結(jié)果");
        for (int i : sorted) {
            System.out.print(i + " ");
        }
    }
}

測試輸出結(jié)果:

增量為:2,結(jié)果:
2 5 2 6 3 
增量為:1,結(jié)果:
2 2 3 5 6 
最終結(jié)果
2 2 3 5 6 

經(jīng)測試,與實(shí)例中結(jié)果一致。

希爾與插入對比

希爾是插入的改進(jìn)優(yōu)化,到底能否提高效率呢,我們作一下小測試。

分別對[1 2 3 4][4 3 2 1] 進(jìn)行兩種算法的排序操作,看移動的次數(shù)。

比較代碼:

package com.coder4j.main.arithmetic.sorting;

public class ShellVSInsert {

    /**
     * 插入排序
     * 
     * @param array
     * @return
     */
    public static int[] insert(int[] array) {
        // 記錄移動次數(shù)
        int count = 0;
        for (int i = 1; i < array.length; i++) {
            int temp = array[i];
            int j;
            for (j = i - 1; j >= 0 && temp < array[j]; j--) {
                array[j + 1] = array[j];
                count++;
            }
            array[j + 1] = temp;
        }
        System.out.println("插入排序移動次數(shù):" + count);
        for (int k : array) {
            System.out.print(k + " ");
        }
        System.out.println();
        return array;
    }
    
    /**
     * 希爾排序
     * 
     * @param array
     * @return
     */
    public static int[] shell(int[] array) {
        // 記錄移動次數(shù)
        int count = 0;
        int step = array.length / 2;
        while (step >= 1) {
            for (int i = step; i < array.length; i++) {
                int temp = array[i];
                int j;
                for (j = i - step; j >= 0 && temp < array[j]; j = j - step) {
                    array[j + step] = array[j];
                    count++;
                }
                array[j + step] = temp;
            }
            step /= 2;
        }
        System.out.println("希爾排序移動次數(shù):" + count);
        for (int k : array) {
            System.out.print(k + " ");
        }
        System.out.println();
        return array;
    }
    
    public static void main(String[] args) {
        int[] array1 = { 1, 2, 3, 4 };
        insert(array1);
        int[] array2 = { 1, 2, 3, 4 };
        shell(array2);
        
        int [] array3 = { 4, 3, 2, 1 };
        insert(array3);
        int [] array4 = { 4, 3, 2, 1 };
        shell(array4);
        
    }
    
}

對比了兩種極端情況,結(jié)果如下:

插入排序移動次數(shù):0
1 2 3 4 
希爾排序移動次數(shù):0
1 2 3 4 
插入排序移動次數(shù):6
1 2 3 4 
希爾排序移動次數(shù):4
1 2 3 4 

可見希爾排序在有些時(shí)候可以減少移動次數(shù)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65416.html

相關(guān)文章

  • 希爾排序就這么簡單

    摘要:這時(shí)就用簡單插入排序?qū)?shù)列直至已序從直觀上看希爾排序就是把數(shù)列進(jìn)行分組不停使用插入排序,直至從宏觀上看起來有序,最后插入排序起來就容易了無須多次移位或交換。 一、希爾排序介紹 來源百度百科: 希爾排序(Shells Sort)是插入排序的一種又稱縮小增量排序(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。該方...

    paulli3 評論0 收藏0
  • 【算法】插入排序——希爾排序+直接插入排序

    希爾排序 在介紹希爾排序之前,先了解一下直接插入排序 文章目錄 希爾排序一、直接插入排序1. 單趟排序2. 直接插入排序 二、希爾排序三、測試希爾排序和直接插入排序性能 一、直接插入排序 1. 單趟排序 x插入一個有序區(qū)間 這里end是指向數(shù)組最后一個元素 2. 直接插入排序 根據(jù)上面的單趟排序啟發(fā) end是數(shù)組的最后一個元素,end之后的元素都是待排序 一個關(guān)鍵的判斷點(diǎn),end和...

    GitChat 評論0 收藏0
  • Javascript算法——希爾排序

    摘要:常見的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。這里主要介紹希爾排序。一圖勝千言算法介紹算法描述希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進(jìn)版本。但希爾排序是非穩(wěn)定排序算法。 常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。這里主要介紹希爾排序。 一圖勝千言: showImg(h...

    lowett 評論0 收藏0
  • 基本算法學(xué)習(xí)(一)之希爾排序(JS)

    摘要:動態(tài)定義間隔序列參考來源詳細(xì)介紹了十種算法大家可以去學(xué)習(xí)下以后大概會盡量每天更新一個算法學(xué)習(xí)吧溫故而知新 參考書:嚴(yán)蔚敏-數(shù)據(jù)結(jié)構(gòu) 希爾排序(Shells Sort) 希爾排序又稱縮小增量排序,歸屬于插入排序一類,簡單來說,和我們的插入排序比,它更快. 奇妙的記憶點(diǎn): 內(nèi)排序(內(nèi)存排序就夠了) 不穩(wěn)定(排序后原始順序無法保證) 希爾排序重點(diǎn)在于分割. 基本思想: 將整個待排序記錄序...

    cooxer 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<