《算法》2.1-初級排序算法

1. 基本規(guī)則

  1. 排序類算法模板
public class Example
{
    public static void sort(Comparable[] a)
    {
        /* See Algorithms 2.1, 2.2, 2.3, 2.4, 2.5, or 2.7. */ }

    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)
    { // Print the array, on a single
        // line.
        for (int i = 0; i < a.length; i++)
            StdOut.print(a[i] + " ");
        StdOut.println();
    }

    public static boolean isSorted(Comparable[] a)
    { // Test whether the array
        // entries are in order.
        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)
    { // Read strings from standard
        // input, sort them, and print.
        String[] a = In.readStrings();
        sort(a);
        assert isSorted(a);
        show(a);
    }
}
  1. Comparable接口
    實現(xiàn)了Comparable接口的數(shù)據(jù)類型:Integer、String涝影、Double都實現(xiàn)了Comparable接口燃逻。創(chuàng)建自己的數(shù)據(jù)類型時臂痕,我們也要實現(xiàn)Comparable接口就能使用該模板進行排序。必須要實現(xiàn)Comparable接口中的compareTo方法姆怪。
public class Date implements Comparable<Date>
{
    private final int day;
    private final int month;
    private final int year;
    public Date(int d, int m, int y)
    {
        day = d;
        month = m;
        year = y;
    }
    public int day() {return day;}
    public int month(){return month;}
    public int year(){return year;}
    public int compareTo(Date that)
    {
        if (this.year > that.year)
            return +1;
        if (this.year < that.year)
            return -1;
        if (this.month > that.month)
            return +1;
        if (this.month < that.month)
            return -1;
        if (this.day > that.day)
            return +1;
        if (this.day < that.day)
            return -1;
        return 0;
    }
    public String toString()
    {
        return month + "/" + day + "/" + year;
    }
}

compareTo必須實現(xiàn)一個全序關(guān)系:
①自反性:對所有的v=v
②反對稱性:對所有v<w都有v>w片效,且v=w時w=v
③傳遞性

  1. 排序成本模型:比較次數(shù)和訪問數(shù)組的次數(shù)
  2. 額外的內(nèi)存使用

2. 選擇排序

  1. 思想
    首先英古,找到數(shù)組中最小的元素召调,其次將它和數(shù)組的第一個元素交換位置。再次只嚣,在剩下的元素中找到最小的元素和數(shù)組的第二個元素交換位置艺沼。如此往復(fù),直到將整個數(shù)組排序调鲸。不斷選擇剩余元素中的最小者藐石。
public class Selection
{
    public static void sort(Comparable[] a)
    {
        int N=a.length;
        for(int i=0;i<N;i++)
        {
            int min=i;
            for(int j=i+1;j<N;j++)
                if(less(a[j],a[min])) min=j;
            exch(a,i,min);
        }
    }
}
  1. Example

    選擇排序

  2. 分析:
    ①運行時間和輸入無關(guān)
    ②數(shù)據(jù)移動是最少的
    ③長度為N的數(shù)組需要交換N次于微,比較次數(shù):(N-1)+(N-2)+...1=N(N-1)/2~![](http://chart.googleapis.com/chart?cht=tx&chl= N^2/2)

3. 插入排序

  1. 思想
    想象打撲克牌,一張一張地把牌插入到適當(dāng)?shù)匚恢们ぁT谟嬎銠C的視線中恋腕,為了要給插入的元素騰出空間,我們需要將其余所有元素在插入之前都向后移動一位祈远。插入排序所需要的時間取決于輸入元素中的初始順序商源。
public class Insertion
{
    public static void sort(Comparable[] a)
    {
        int N=a.length;
        for(int i=1;i<N;i++)
        {   //a[i]插入到a[i-1] a[i-2]...1中
            for(int j=i;j>=0&&less(a[j],a[j-1]);j--)
            {
                exch(a,j,j-1);
            }
        }
    }
}
  1. Example
    插入排序
  2. 分析:
    ①best:輸入順序增大牡彻,無需移動元素庄吼,只需要N-1次比較。
    ②worst:輸入是逆序的:N2/2次比較和交換
    ③平均:N2/4次比較和交換

4. 希爾排序

  1. 思想:
    基于插入排序的快速排序算法器罐。對于大規(guī)模亂序的數(shù)組插入排序很慢渐行,是因為它只會交換相鄰的元素,因此元素只能一點一點移動肴沫。希爾排序改進了插入排序算法蕴忆,交換不相鄰的元素以對數(shù)組的局部進行排序颤芬,并最終用插入排序?qū)⒕植坑行虻臄?shù)組排序。 關(guān)鍵:使數(shù)組中任意間隔為h的元素都是有序的
public static void sort(Comparable[] a) {
        int n = a.length;
        // 3x+1 increment sequence:  1, 4, 13, 40, 121, 364, 1093, ... 
        int h = 1;
        while (h < n/3) h = 3*h + 1; 
        while (h >= 1) {
            // h-sort the array
            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);
                }
            }
            assert isHsorted(a, h); 
            h /= 3;
        }
        assert isSorted(a);
}
  1. Example
    希爾排序
  2. 分析:
    希爾排序是基于插入排序的一種算法, 在此算法基礎(chǔ)之上增加了一個新的特性站蝠,提高了效率汰具。希爾排序的時間復(fù)雜度與增量序列的選取有關(guān),希爾排序時間復(fù)雜度的下界是n*log2n沉衣。希爾排序沒有快速排序算法快 O(n(logn)),因此中等大小規(guī)模表現(xiàn)良好减牺,對規(guī)模非常大的數(shù)據(jù)排序不是最優(yōu)選擇豌习。但是比O( n^2 )復(fù)雜度的算法快得多。并且希爾排序非常容易實現(xiàn)拔疚,算法代碼短而簡單。 此外稚失,希爾算法在最壞的情況下和平均情況下執(zhí)行效率相差不是很多栋艳,與此同時快速排序在最壞的情況下執(zhí)行的效率會非常差。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末句各,一起剝皮案震驚了整個濱河市吸占,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凿宾,老刑警劉巖矾屯,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異初厚,居然都是意外死亡件蚕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門产禾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來排作,“玉大人,你說我怎么就攤上這事亚情⊥荆” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵楞件,是天一觀的道長拌夏。 經(jīng)常有香客問我,道長履因,這世上最難降的妖魔是什么障簿? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮栅迄,結(jié)果婚禮上站故,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好西篓,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布愈腾。 她就那樣靜靜地躺著,像睡著了一般岂津。 火紅的嫁衣襯著肌膚如雪虱黄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天吮成,我揣著相機與錄音橱乱,去河邊找鬼。 笑死粱甫,一個胖子當(dāng)著我的面吹牛泳叠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茶宵,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼危纫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乌庶?” 一聲冷哼從身側(cè)響起种蝶,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞒大,沒想到半個月后蛤吓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡糠赦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年会傲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拙泽。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡淌山,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顾瞻,到底是詐尸還是另有隱情泼疑,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布荷荤,位于F島的核電站退渗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蕴纳。R本人自食惡果不足惜会油,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望古毛。 院中可真熱鬧翻翩,春花似錦都许、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桨仿。三九已至,卻和暖如春服傍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伴嗡。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工急波, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留从铲,地道東北人瘪校。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓名段,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伸辟。 傳聞我的和親對象是個殘疾皇子麻惶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,724評論 0 33
  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子信夫,從出生后第3個月起每個月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 1,844評論 0 2
  • 【程序1】 題目:古典問題:有一對兔子静稻,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔...
    葉總韓閱讀 5,126評論 0 41
  • 受傷恢復(fù)得那么快是因為每次都有人來治愈自己杀迹,漸漸地貪戀了這種不靠自己就想忘掉上一段感情的方法押搪∈骼遥可是大州,從未想到续语,會遇...
    十七姑娘誒閱讀 501評論 1 1
  • 九曲黃河第一灣的壯闊厦画,讓在城市森林中憋屈久了的人瞬間釋放,在壯麗的九曲十八彎騎馬放歌娃豹,蕩氣回腸焚虱,自駕旅行的意義懂版,大...
    耕天下閱讀 607評論 0 1