冒泡排序
冒泡排序是一種交換排序,它的基本思想是相鄰的元素進行比較交換。
代碼實現
package bubbleSort
import (
"errors"
"fmt"
)
// 冒泡排序找最大
func BubbleFindMax(arr []int) (max int, err error) {
// 數組長度
length := len(arr)
// 空數組
if length == 0 {
err = errors.New("空數組")
return
}
if length == 1 {
max = arr[0]
return
}
// 遍歷,兩兩比較
for i := 0; i < length-1; i++ {
if arr[i] > arr[i+1] {
arr[i], arr[i+1] = arr[i+1], arr[i]
}
}
max = arr[length-1]
return
}
func BubbleSort(arr []int) []int {
// 數組長度
length := len(arr)
if length <= 1 {
return arr
}
// 遍歷
for i := 0; i < length-1; i++ {
// 標記,如果循環了一遍沒有發生交換,則代表數組已經有序了,不用再排序
flag := false
for j := 0; j < length-1-i; j++ {
// 兩兩交換
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
flag = true
}
fmt.Println(i, ":", arr)
}
if !flag {
break
}
}
return arr
}
時間複雜度
最好的情況,元素都是有序的,只需要遍歷n-1次,則時間複雜度爲O(n)。
最壞的情況,全部元素都要交換,則時間複雜度爲O(n^2)。
穩定性
冒泡排序是一種穩定排序算法。
冒泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,是不會再交換的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以冒泡排序是一種穩定排序算法。