算法系列筆記(四)基本排序

今天這篇文章簡單介紹下最最最基礎(chǔ)的排序

我們數(shù)據(jù)的存儲方式默認(rèn)為數(shù)組,長度為N個元素

選擇排序:

算法描述:就是在數(shù)組中找到最小的元素恼五,和第一位元素互換內(nèi)容昌罩,倘若第一位的元素最小,則自己和自己互換灾馒。然后從第二位開始(因為第一位已經(jīng)排好序了)遍歷數(shù)組找到現(xiàn)存最小的元素茎用,讓他和第二互換位置。然后從第三位開始重復(fù)睬罗。轨功。。容达。古涧。

影響排序的時間的因素有兩點(diǎn),一個是數(shù)據(jù)移動董饰,為N次蒿褂。一個是數(shù)組比較(其實(shí)就是數(shù)組遍歷的過程)為N-1+N-2+····+2+1=N(N-1)/2約為N^2的量級

根據(jù)上面分析可以看出選擇排序的時間和輸入無關(guān)圆米,無論是隨機(jī)打亂的數(shù)組還是已經(jīng)排好序的數(shù)組卒暂,進(jìn)行排序所用的時間都一樣。

選擇排序的代碼實(shí)現(xiàn)

public class Selection {
    public static void sort(int [] a) {
        int n=a.length;
        int min;
        for(int i=0;i<n;i++) {          //i代表正在排序的位置
            min=i;
            for(int j=i+1;j<n;j++) {          //遍歷數(shù)組只需要從i后面的數(shù)組就行娄帖,前面已經(jīng)排好序了
                if(a[j]<a[min]) min=j;        //找到最小的元素也祠,然后記錄它的序號
            }
        exchange(a, i, min);
        }
    }
    
    //交換數(shù)組元素的次序
    public void exchange(int []a,int b,int min) {
            int temp=a[b];
            a[b]=a[min];
            a[min]=temp;
    }
}

插入排序:

算法描述:是自己從大到小的序號開始遍歷數(shù)組元素,比如剛好遍歷到i序號近速,則序號0-(i-1)都是維護(hù)大小順序诈嘿,現(xiàn)在就是要將原來序號為i的的元素插入到已經(jīng)維護(hù)好的數(shù)組堪旧,形成排序好的i+1數(shù)組,不斷增加排序好的數(shù)組的元素數(shù)目奖亚。最后形成數(shù)量為n的排序后的數(shù)組淳梦。

這個算法的時間是和輸入有關(guān)的最壞情況要分別有~n^/2 比較和交換。最好的情況為n-1次比較0次交換昔字,平均下來是n^2/4的比較和交換爆袍,看起來如果n比較大的話好像插入比選擇排序更快

public class Insertionsort {
    public static void sort(int []a) {
        int n=a.length;
        for(int i=1;i<n;i++) {
            for(int j=i;j>0&&(a[j]<a[j-1]);j--) {
                exchange(a,j,j-1);
            }
        }
    }
    public static void exchange(int []a,int b,int min) {
        int temp=a[b];
        a[b]=a[min];
        a[min]=temp;
}
}

希爾排序

這個有一點(diǎn)點(diǎn)難懂,它其實(shí)是上面插入排序的升級版作郭。不過它維護(hù)數(shù)組不是從左到右長度逐漸變大(傳統(tǒng)插入排序的方式)陨囊。它是將數(shù)組分成gap組,每組數(shù)組的元素為間隔為gap的元素夹攒,每一組的元素數(shù)可能為n/gap(如果gap不是n的因數(shù)的話部分?jǐn)?shù)組的元素數(shù)為n/gap+1)然后分別維護(hù)他們的順序蜘醋。然后再將gap的值按一定規(guī)則變小,重新切割數(shù)組再維護(hù)數(shù)組順序咏尝。gap變得越來越小压语,最后變成1。這時候就維護(hù)長度為n的序列编检,就是完整的遍歷冒泡排序无蜂,(冒泡和插入,區(qū)別不大蒙谓,但是有區(qū)別的斥季,具體查查冒泡排序)這里說冒泡是強(qiáng)調(diào)最后一次數(shù)組遍歷保證排序的正確性,前面的工作只是為了減少這一步的比較和交換次序的操作累驮。

希爾排序的核心思想維護(hù)部分部分有序最終利于維護(hù)整體有序酣倾。

public class Shellsort {
 public static void sort(int [] a) {
     int n=a.length;
     int gap=n/2;
     while(gap>=1) {
         for(int i=gap;i<n;i++) {
         for(int j=i;j>=0&&a[j]<a[j-gap];j-=gap) {
             exchange(a,j,j-gap);
         }
         }
         gap/=2;
     }
 }
 public static void exchange(int []a,int b,int c) {
     int temp=a[b];
     a[b]=a[c];
     a[c]=temp;
 }
}

注意gap的取值和縮小規(guī)律是如何其實(shí)都是沒關(guān)系的,不會影響算法的正確性谤专。但是gap一定要最后是為1T晡!置侍!

希爾排序?qū)χ械却笮〉臄?shù)組的運(yùn)行時間還是可以接受的映之,但它還只是一種基礎(chǔ)的算法,對于大型的數(shù)組排序還是需要更高效的算法蜡坊,這就需要我們繼續(xù)的學(xué)習(xí)了杠输。:)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秕衙,隨后出現(xiàn)的幾起案子蠢甲,更是在濱河造成了極大的恐慌,老刑警劉巖据忘,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹦牛,死亡現(xiàn)場離奇詭異搞糕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)曼追,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門窍仰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人礼殊,你說我怎么就攤上這事辈赋。” “怎么了膏燕?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵钥屈,是天一觀的道長。 經(jīng)常有香客問我坝辫,道長篷就,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任近忙,我火速辦了婚禮竭业,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘及舍。我一直安慰自己未辆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布锯玛。 她就那樣靜靜地躺著咐柜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪攘残。 梳的紋絲不亂的頭發(fā)上拙友,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機(jī)與錄音歼郭,去河邊找鬼遗契。 笑死,一個胖子當(dāng)著我的面吹牛病曾,可吹牛的內(nèi)容都是我干的牍蜂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼泰涂,長吁一口氣:“原來是場噩夢啊……” “哼鲫竞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起负敏,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贡茅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后其做,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顶考,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年妖泄,在試婚紗的時候發(fā)現(xiàn)自己被綠了驹沿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹈胡,死狀恐怖渊季,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罚渐,我是刑警寧澤却汉,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站荷并,受9級特大地震影響合砂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜源织,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一翩伪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谈息,春花似錦缘屹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逻炊,卻和暖如春踢代,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗅骄。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工胳挎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溺森。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓慕爬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屏积。 傳聞我的和親對象是個殘疾皇子医窿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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

  • 排序算法說明 (1)排序的定義:對一序列對象根據(jù)某個關(guān)鍵字進(jìn)行排序; 輸入:n個數(shù):a1,a2,a3,…,an 輸...
    code武閱讀 665評論 0 0
  • Ba la la la ~ 讀者朋友們炊林,你們好啊姥卢,又到了冷鋒時間,話不多說,發(fā)車独榴! 1.冒泡排序(Bub...
    王飽飽閱讀 1,800評論 0 7
  • 小小一直在家門口徘徊僧叉,她沒有勇氣踏進(jìn)這扇門,沒有勇氣面對她的老公和孩子棺榔。特別是昨天下午瓶堕,老公帶兒子去廣州玩了三天,...
    木辛子子閱讀 199評論 0 0
  • 榆錢樹 你靜靜的立在路邊 集一身故事為我們所道 在祖輩那里 你是自然災(zāi)害的阻擋者 有你症歇,生活不再那么緊蹙 在父輩那...
    震血封侯閱讀 258評論 1 6
  • 01 世界上忘晤,沒有永遠(yuǎn)的朋友也沒有永遠(yuǎn)的敵人咕痛,只有永遠(yuǎn)的利益秒梳。婚姻更是如此。 “他不敢跟我離婚”砾医,梅姐淡淡一笑仅偎,“...
    我是姜燕妮閱讀 262評論 0 1