冒泡排序

1、算法描述:

冒泡排序(Bubble Sort) ,是一種計(jì)算機(jī)科學(xué)領(lǐng)域的較簡(jiǎn)單的排序算法

它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。

這個(gè)算法的名字由來是因?yàn)樵酱蟮脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端,故名冒泡排序(Bubble Sort)。

2、解答思路:

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

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

3、實(shí)現(xiàn):

Swift版

class BubbleSort {
    func sort(array : [Int]) -> [Int]? {
        
        let index = array.count - 1
        if index < 0 {
            return nil
        }
        var copyArray = array
        
        for out in 0...index {
            for inner in 0..<(index-out) {    //  從前往后遍歷
                if copyArray[inner] < copyArray[inner + 1] {
                    var temp = copyArray[inner]
                    copyArray[inner] = copyArray[inner + 1]
                    copyArray[inner + 1] = temp
                }
            }
        }
//        for out in 0...index {
//            var inner = index
//
//            while inner>out {   //從后往前遍歷
//                if copyArray[inner] > copyArray[inner - 1] {
//                    let temp = copyArray[inner]
//                    copyArray[inner] = copyArray[inner - 1]
//                    copyArray[inner - 1] = temp
//                }
//                inner -= 1
//            }
//        }
        
        return copyArray
    }
}

let test = BubbleSort()
var array  = [Int](repeating: 0, count: 20)

for index in 0..<20 {
    array[index] = Int(arc4random_uniform(20)) + Int(arc4random_uniform(20)) + 1
}
test.sort(array : array)

C語言

void bubbleSort(int array[], int n) {
    if (n<0) {
        return;
    }
    int temp = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i -1; j++) {
            if (array[j] < array[j+1]) {
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
}

4、分析:

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

時(shí)間復(fù)雜度是講算法最壞情況下需要運(yùn)行的次數(shù)。
關(guān)鍵字比較次數(shù)C 和記錄移動(dòng)次數(shù)M
當(dāng)原數(shù)據(jù)完全逆序時(shí),需要進(jìn)行 n-1 趟排序。每趟排序要進(jìn)行 n - i 次關(guān)鍵字的比較(1≤i≤n-1),且每次比較都必須移動(dòng)記錄三次來達(dá)到交換記錄位置。在這種情況下,比較和移動(dòng)次數(shù)均達(dá)到最大值:

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

移動(dòng)次數(shù)

所以算法時(shí)間復(fù)雜度為:
時(shí)間復(fù)雜度

2)、空間復(fù)雜度:

此算法需要的額外空間為一個(gè)temp元素的空間,當(dāng)然對(duì)于整型數(shù)據(jù),連這個(gè)temp都可以省略:

int a,b;
a = a + b
b = a - b
a = a - b

即可達(dá)到交換的目的。
所以空間復(fù)雜度為:O(1)

3)、算法穩(wěn)定性:

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

5、聯(lián)系方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。