詳解排序算法--插入排序和冒泡排序

  • 冒泡排序
  • 插入排序
  • 插入排序和冒泡排序分析

冒泡排序

Paste_Image.png

冒泡排序(英語:Bubble Sort怜械,臺灣另外一種譯名為:泡沫排序)是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列成洗,一次比較兩個(gè)元素摧茴,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換饲梭,也就是說該數(shù)列已經(jīng)排序完成。盡管這個(gè)算法是最簡單了解和實(shí)現(xiàn)的排序算法之一焰檩,但它對于包含大量的元素的數(shù)列排序是很沒有效率的憔涉。

冒泡排序算法的運(yùn)作如下:

  • 比較相鄰的元素。如果第一個(gè)比第二個(gè)大锅尘,就交換他們兩個(gè)监氢。
  • 對每一對相鄰元素作同樣的工作布蔗,從開始第一對到結(jié)尾的最后一對藤违。這步做完后,最后的元素會是最大的數(shù)纵揍。
  • 針對所有的元素重復(fù)以上的步驟顿乒,除了最后一個(gè)。
  • 持續(xù)每次對越來越少的元素重復(fù)上面的步驟泽谨,直到?jīng)]有任何一對數(shù)字需要比較璧榄。

冒泡排序如果能在內(nèi)部循環(huán)第一次運(yùn)行時(shí)特漩,使用一個(gè)旗標(biāo)來表示有無需要交換的可能,也可以把最壞情況下的復(fù)雜度降低到{O(n)}
在這個(gè)情況骨杂,已經(jīng)排序好的數(shù)列就無交換的需要涂身。

  • 最壞時(shí)間復(fù)雜度
O(n^{2})
O(n^{2})
  • 最優(yōu)時(shí)間復(fù)雜度
O(n)
O(n)
  • 平均時(shí)間復(fù)雜度
O(n^{2})
O(n^{2})
  • 空間復(fù)雜度
    總共{O(n)}
    需要輔助空間{O(1)}

  • 穩(wěn)定的排序

冒泡排序的動態(tài)圖:

201111301912294589.gif

Java代碼實(shí)現(xiàn):

package cc;

public class BubbleSort {
    
    public static void bubblesort(int[] a) {
        bubblesort(a, 0, a.length-1);
    }
    
    private static void bubblesort(int[] a, int left, int right) {
        
        for(int p=right;p>=left;p--) {
            int flag = 0;
            for(int i=0;i<p;i++) {
                if(a[i] > a[i+1]) {
                    swap(a, i, i+1);
                    flag = 1;
                }
            }
            if(flag == 0)
                break;
        }
    }

    private static void swap(int[] a, int i, int j) {
        
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
        
    }
}

插入排序

類似于摸牌的過程

Paste_Image.png

插入排序(英語:Insertion Sort)是一種簡單直觀的排序算法。它的工作原理是通過構(gòu)建有序序列搓蚪,對于未排序數(shù)據(jù)蛤售,在已排序序列中從后向前掃描,找到相應(yīng)位置并插入妒潭。插入排序在實(shí)現(xiàn)上悴能,通常采用in-place排序(即只需用到O(1)的額外空間的排序),因而在從后向前掃描過程中雳灾,需要反復(fù)把已排序元素逐步向后挪位漠酿,為最新元素提供插入空間。

算法描述:

  • 從第一個(gè)元素開始谎亩,該元素可以認(rèn)為已經(jīng)被排序
  • 取出下一個(gè)元素炒嘲,在已經(jīng)排序的元素序列中從后向前掃描
  • 如果該元素(已排序)大于新元素,將該元素移到下一位置
  • 重復(fù)步驟3团驱,直到找到已排序的元素小于或者等于新元素的位置
  • 將新元素插入到該位置后
  • 重復(fù)步驟2~5

如果比較操作的代價(jià)比交換操作大的話摸吠,可以采用二分查找法來減少比較操作的數(shù)目。該算法可以認(rèn)為是插入排序的一個(gè)變種嚎花,稱為二分查找插入排序寸痢。

  • 最壞時(shí)間復(fù)雜度
O(n^{2})
O(n^{2})
  • 最優(yōu)時(shí)間復(fù)雜度
O(n)
O(n)
  • 平均時(shí)間復(fù)雜度
O(n^{2})
O(n^{2})
  • 空間復(fù)雜度
    總共{O(n)}
    需要輔助空間{ O(1)}

  • 穩(wěn)定的排序

插入排序動態(tài)圖:

Insertion-sort-example-300px.gif
Insertion_sort_animation.gif

Java代碼

package cc;

public class InsertSort {

    public static void insertsort(int[] a) {
        insertsort(a, 0, a.length-1);
    }
    
    private static void insertsort(int[] a, int left , int right) {
        int j;
        
        for(int p = left+1;p<=right;p++) {
            int temp = a[p];
            for(j=p;j>left && a[j-1] > temp;j--)
                a[j] = a[j-1];
            a[j] = temp;
        }
    }
}

插入排序和冒泡排序分析

首先我們引入逆序?qū)Φ母拍?/p>

對于下標(biāo)i<j,如果A[i]>A[j]紊选,則稱(i,j)是一對逆序?qū)?inversion)

交換2個(gè)相鄰元素正好消去1個(gè)逆序?qū)Γ?/strong>

給定初始序列{34, 8, 64, 51,32, 21}啼止,冒泡排序和插入排序分別需要多少次元素交換才能完成?
交換次數(shù)就是逆序?qū)Φ拇螖?shù)兵罢,都是9次

插入排序: T(N, I) = O( N+I )献烦,如果序列基本有序,則插入排序簡單且高效

定理:任意N個(gè)不同元素組成的序列平均具有N ( N - 1 ) / 4 個(gè)逆序?qū)Α?/p>

定理:任何僅以交換相鄰兩元素來排序的算法卖词,其平均時(shí)間復(fù)雜度為 ( N2 ) 巩那。 這意味著:要提高算法效率,我們

  • 每次消去不止1個(gè)逆序?qū)Γ?/li>
  • 每次交換相隔較遠(yuǎn)的2個(gè)元素此蜈!

這就是希爾排序的由來即横。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市裆赵,隨后出現(xiàn)的幾起案子东囚,更是在濱河造成了極大的恐慌,老刑警劉巖战授,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件页藻,死亡現(xiàn)場離奇詭異桨嫁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)份帐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門璃吧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人废境,你說我怎么就攤上這事肚逸。” “怎么了彬坏?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵朦促,是天一觀的道長。 經(jīng)常有香客問我栓始,道長务冕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任幻赚,我火速辦了婚禮禀忆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘落恼。我一直安慰自己箩退,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布佳谦。 她就那樣靜靜地躺著戴涝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钻蔑。 梳的紋絲不亂的頭發(fā)上啥刻,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音咪笑,去河邊找鬼可帽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窗怒,可吹牛的內(nèi)容都是我干的映跟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼扬虚,長吁一口氣:“原來是場噩夢啊……” “哼努隙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孔轴,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤剃法,失蹤者是張志新(化名)和其女友劉穎碎捺,沒想到半個(gè)月后路鹰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贷洲,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年晋柱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了优构。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雁竞,死狀恐怖钦椭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碑诉,我是刑警寧澤彪腔,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站进栽,受9級特大地震影響德挣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜快毛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一格嗅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唠帝,春花似錦屯掖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瀑晒,卻和暖如春阀湿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瑰妄。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工陷嘴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人间坐。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓灾挨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親竹宋。 傳聞我的和親對象是個(gè)殘疾皇子劳澄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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

  • 該篇文章主要介紹了算法基礎(chǔ)以及幾種常見的排序算法:選擇排序、插入排序蜈七、冒泡排序秒拔、快速排序、堆排序飒硅。 一砂缩、算法基礎(chǔ) ...
    ZhengYaWei閱讀 1,243評論 0 12
  • Ba la la la ~ 讀者朋友們作谚,你們好啊,又到了冷鋒時(shí)間庵芭,話不多說妹懒,發(fā)車! 1.冒泡排序(Bub...
    王飽飽閱讀 1,788評論 0 7
  • 眉湖池畔双吆,月下石上眨唬,想乘風(fēng)納涼,卻水波不興好乐,岸樹不動匾竿;乍起水花,偶來蛙鳴蔚万,聽魚蛙且樂搂橙,而我自落寞,獨(dú)喂蚊蟲笛坦。
    山長說閱讀 149評論 0 1
  • 我去過離你很近的地方 也曾駐足長亭外 遙望你去的遠(yuǎn)方 只有這樣 我才不會惆悵
    栩芠閱讀 187評論 3 1
  • 今天是美育特色課程的一天区转,我們高高興興地來了教室等老師來給我們講怎么做。 老師來了以后我們要興...
    祥頤閱讀 289評論 0 0