希爾排序算法

希爾排序(Shell Sort)是插入排序]的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進(jìn)版本顺饮。希爾排序是非穩(wěn)定排序算法。

希爾排序是把記錄按下標(biāo)的一定增量分組誊册,對(duì)每組使用直接插入排序算法排序领突;隨著增量逐漸減少,每組包含的關(guān)鍵詞越來越多案怯,當(dāng)增量減至1時(shí)君旦,整個(gè)文件恰被分成一組,算法便終止嘲碱。

先取一個(gè)小于n的整數(shù)d1作為第一個(gè)增量金砍,把文件的全部記錄分組。所有距離為d1的倍數(shù)的記錄放在同一個(gè)組中麦锯。先在各組內(nèi)進(jìn)行直接插入排序恕稠;然后,取第二個(gè)增量d2<d1重復(fù)上述的分組和排序扶欣,直至所取的增量=1鹅巍,即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹埂?/p>

該方法實(shí)質(zhì)上是一種分組插入方法

比較相隔較遠(yuǎn)距離(稱為增量的數(shù),使得數(shù)移動(dòng)時(shí)能跨過多個(gè)元素料祠,則進(jìn)行一次比較就可能消除多個(gè)元素交換骆捧。

其算法的Java代碼如下:

import java.util.Scanner;

public class ShellSort {
    //希爾排序算法
    public static void sort(Comparable[] a){
        //將a[]按升序排列
        int N = a.length;
        int h = 1;
        while(h < N/3){
            h = 3*h+1;//1,4,13,40,121,364,1093,...
        }
        while(h > 1){
            //將數(shù)組變?yōu)閔有序
            for(int i=h; i<N; i++){
                //將a[i]插入到a[i-h],a[i-2*h],a[i-3*h]...之中
                for(int j=i; j>=h && less(a[j],a[j-h]); j-=h ){
                    exch(a,j,j-h);
                }
            }
            h /= 3;
        }
    }
    
    private static boolean less(Comparable v,Comparable w){
        return v.compareTo(w) < 0;
    }
    
    private static void exch(Comparable[] a,int i,int j){
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
    
    private static void show(Comparable[] a){
        //在單行打印數(shù)組
        for(int i=0; i<a.length; i++){
            System.out.print(a[i] + " ");
        }
    }
    
    public static boolean isSorted(Comparable[] a){
        //測(cè)試數(shù)組是否有序
        for(int i=1; i<a.length; i++){
            if(less(a[i],a[i-1])){
                return false;
            }
        }
        return true;
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //從標(biāo)準(zhǔn)輸入讀取字符串,將它們排序并輸出
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        Comparable[] a = new Comparable[str.length()];
        
        for(int i=0; i<str.length(); i++){
            a[i] = str.charAt(i);
        }
        sort(a);
        assert isSorted(a);
        show(a);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末髓绽,一起剝皮案震驚了整個(gè)濱河市敛苇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌顺呕,老刑警劉巖枫攀,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括饶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡来涨,警方通過查閱死者的電腦和手機(jī)图焰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹦掐,“玉大人楞泼,你說我怎么就攤上這事◇源常” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵棍厂,是天一觀的道長(zhǎng)颗味。 經(jīng)常有香客問我,道長(zhǎng)牺弹,這世上最難降的妖魔是什么浦马? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮张漂,結(jié)果婚禮上晶默,老公的妹妹穿的比我還像新娘。我一直安慰自己航攒,他們只是感情好磺陡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漠畜,像睡著了一般币他。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上憔狞,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天蝴悉,我揣著相機(jī)與錄音,去河邊找鬼瘾敢。 笑死拍冠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的簇抵。 我是一名探鬼主播庆杜,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼正压!你這毒婦竟也來了欣福?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤焦履,失蹤者是張志新(化名)和其女友劉穎拓劝,沒想到半個(gè)月后雏逾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郑临,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年栖博,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厢洞。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仇让,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躺翻,到底是詐尸還是另有隱情丧叽,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布公你,位于F島的核電站踊淳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏陕靠。R本人自食惡果不足惜迂尝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剪芥。 院中可真熱鬧垄开,春花似錦、人聲如沸税肪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寸认。三九已至签财,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偏塞,已是汗流浹背唱蒸。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灸叼,地道東北人神汹。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像古今,于是被迫代替她去往敵國(guó)和親屁魏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356