一、普通的冒牌排序
//正常版冒泡排序
func bubbleSort(array []int) []int {
tmp := 0
for i := 0; i < len(array); i++ {
for j := 0; j < len(array)-1; j++ {
if array[j] > array[j+1] {
tmp = array[j]
array[j] = array[j+1]
array[j+1] = tmp
}
}
}
return array
}
正常的冒泡排序在相邻的两个值已经是有序的情况下仍然要兢兢业业的进行比对,这是一可以优化的空间。
二、如果我们能判断出数列已经有序并且做上标记,那么剩下的几轮排序就可以不必执行,提早结束工作。
//第一次优化:有序的不必再次循环
func bubbleSort2(array []int) []int {
tmp := 0
for i := 0; i < len(array); i++ {
isSorted := true
for j := 0; j < len(array)-1; j++ {
if array[j] > array[j+1] {
tmp = array[j]
array[j] = array[j+1]
array[j+1] = tmp
isSorted = false
}
}
if isSorted {
break
}
}
return array
}
三、如果所给的数组是一个一般有序一般无序的数组
//第二次优化:一个一般有序一般无序的数组
func bubbleSort3(array []int) []int {
tmp := 0
lastExchangeIndex := 0 //记录最后一次交换的位置
sortBorder := len(array) - 1 //无序数列的边界,每次比较需要比到这里为止
for i := 0; i < len(array); i++ {
isSorted := true
for j := 0; j < sortBorder; j++ {
if array[j] > array[j+1] {
tmp = array[j]
array[j] = array[j+1]
array[j+1] = tmp
isSorted = false //有元素交换,所以不是有序的,标记为false
lastExchangeIndex = j //把无序数列的边界更新为最后一次减缓元素的为止
}
}
sortBorder = lastExchangeIndex
if isSorted {
break
}
}
return array
}