排序:冒泡排序(算法)

文 | 莫若吻


一、簡介

冒泡排序(Bubble Sort),是一種計(jì)算機(jī)科學(xué)領(lǐng)域的較簡單的排序算法。
這個(gè)算法的名字由來是因?yàn)樵酱蟮脑貢?jīng)由交換慢慢“浮”到數(shù)列的頂端,故名。

二、原理

(升序排列為例)
1.比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
2.對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。在這一點(diǎn),最后的元素應(yīng)該會是最大的數(shù)。
3.針對所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
4.持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。

三、原理過程圖

相鄰兩個(gè)元素進(jìn)行比較,如果符合條件換位。
第一圈:最值出現(xiàn)在了最后位。后面以此類推。(如下圖)

冒泡排序.png

四、時(shí)間復(fù)雜度

若文件的初始狀態(tài)是正序的,一趟掃描即可完成排序。所需的關(guān)鍵字比較次數(shù) C和記錄移動(dòng)次數(shù)M均達(dá)到最小值:

Paste_Image.png

。所以,冒泡排序最好的時(shí)間復(fù)雜度為: O(n)。
  若初始文件是反序的,需要進(jìn)行 n-1趟排序。每趟排序要進(jìn)行 n-i次關(guān)鍵字的比較(1≤i≤n-1),且每次比較都必須移動(dòng)記錄三次來達(dá)到交換記錄位置。在這種情況下,比較和移動(dòng)次數(shù)均達(dá)到最大值:

Paste_Image.png

冒泡排序的最壞時(shí)間復(fù)雜度為** O(n2)** 。

綜上,因此冒泡排序總的平均時(shí)間復(fù)雜度為 ** O(n2)** 。

五、性能分析(穩(wěn)定性)

冒泡排序就是把小的元素往前調(diào)或者把大的元素往后調(diào)。比較是相鄰的兩個(gè)元素比較,交換也發(fā)生在這兩個(gè)元素之間。所以,如果兩個(gè)元素相等,不會交換;如果兩個(gè)相等的元素沒有相鄰,那么即使通過前面的兩兩交換把兩個(gè)相鄰起來,這時(shí)候也不會交換,所以相同元素的前后順序并沒有改變,所以冒泡排序是一種穩(wěn)定排序算法。

六、示例代碼(Java):

1.核心代碼

/*
    冒泡排序:相鄰兩個(gè)元素進(jìn)行比較,如果符合條件換位。
    第一圈:最值出現(xiàn)在了最后位。
    */

    public static void bubbleSort(int[] arr)
    {
        for(int x=0; x<arr.length-1; x++)
        {                   
            for(int y=0; y<arr.length-x-1; y++)
            {   //y代表數(shù)組角標(biāo)。-x:讓每一次比較的元素減少,-1:避免角標(biāo)越界。     
                if(arr[y]<arr[y+1])
                {
                    int temp = arr[y];
                    arr[y] = arr[y+1];
                    arr[y+1] = temp;
                }
            }
        }
    }

2.選擇排序與冒泡排序相關(guān)示例

選擇排序.png
冒泡排序.png



版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請必須注明出處,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,308評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,831評論 0 15
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,379評論 0 35
  • 還是孩提的時(shí)候,我和弟弟與爺爺奶奶一起住在鄉(xiāng)下,他們整天勞作根本顧不上我們,當(dāng)然那時(shí)候鄉(xiāng)村的生活還是簡樸而澄凈的,...
    一顆沙子閱讀 246評論 0 1
  • 什么叫真正的放下?就是有一天,當(dāng)你再次面對你過往的難堪,你憎恨惱怒的人,心如止水,不再起心動(dòng)念,坦然面對,一...
    田中玉10495閱讀 399評論 0 0

友情鏈接更多精彩內(nèi)容