iOS 算法-冒泡排序

冒泡排序就是把小的元素往前調或者把大的元素日後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。因此,若是兩個元素相等,我想你是不會再無聊地把他們倆交換一下的;算法

若是兩個相等的元素沒有相鄰,那麼即便經過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,因此相同元素的先後順序並無改變,因此冒泡排序是一種穩定排序算法 圖解 bash

func sort() {
    var arr = [3,6,4,2,11,10,5]
    for i in 0..<arr.count {
        for j in 0..<arr.count-1-i {
            if arr[j] > arr[j+1] {
                arr.swapAt(j, j+1)
            }
        }
        print(arr)
    }
    print(arr)
}

複製代碼

優化點--當隊列提早變得有序時,提早結束循環

  • Q:那麼如何肯定已經提早有序了呢?
  • A:只須要內部循環下來一次交換都沒有發生過,就說明此序列已經有序,就能夠提早結束了。即在交換中有一個標識便可。
func sort() {
    var arr = [3,6,4,2,11,10,5]
    for i in 0..<arr.count {
        var isSort = true
        for j in 0..<arr.count-1-i {
            if arr[j] > arr[j+1] {
                arr.swapAt(j, j+1)
                isSort = false
            }
        }
        if isSort {
            break
        }
        print(arr)
    }
    print(arr)
}
複製代碼

優化點--當隊列部分有序時,記錄部分有序的位置,也就是偶爾邁大步子。

既然總體數列會提早有序,那麼當數列部分有序時,冒泡排序還傻傻的以步長1,不斷的進行循環。優化

  • Q:那麼如何肯定下次邁多大步呢呢?
  • A:只須要記錄最後一次交換的位置,那麼此處下標減1即爲下次邁步到的位置。
func sort() {
    var arr = [3,6,4,2,11,10,5]
    
    var len = arr.count - 1
    var endIndex = 0
    for _ in 0..<arr.count {
        var isSort = true
        for j in 0..<len {
            if arr[j] > arr[j+1] {
                arr.swapAt(j, j+1)
                isSort = false
                endIndex = j
            }
        }
        if isSort {
            break
        }
        len = endIndex
        print(arr)
    }
    print(arr)
}
複製代碼
相關文章
相關標籤/搜索