冒泡排序
依次优化
func bubble_sort_v1(arrry []int) {
for i := 0; i < len(arrry)-1; i++ {
for j := 0; j < len(arrry)-1-i; j++ {
if arrry[j] > arrry[j+1] {
temp := arrry[j]
arrry[j] = arrry[j+1]
arrry[j+1] = temp
}
}
}
}
func bubble_sort_v2(arrry []int) {
for i := 0; i < len(arrry)-1; i++ {
//有序标记,每一轮的初始是true
var is_sorted bool = true
for j := 0; j < len(arrry)-1-i; j++ {
if arrry[j] > arrry[j+1] {
temp := arrry[j]
arrry[j] = arrry[j+1]
arrry[j+1] = temp
//有元素交换,所以不是有序的,标记为false
is_sorted = false
}
}
if is_sorted {
break
}
}
}
func bubble_sort_v3(arrry []int) {
//记录最后一次交换的位置
last_exchange_index := 0
//无序数列的边界,每次比较只需要比到这里
sort_boeder := len(arrry) - 1
for i := 0; i < len(arrry)-1; i++ {
//有序标记,每一轮的初始是true
var is_sorted bool = true
for j := 0; j < sort_boeder; j++ {
if arrry[j] > arrry[j+1] {
temp := arrry[j]
arrry[j] = arrry[j+1]
arrry[j+1] = temp
//有元素交换,所以不是有序的,标记为false
is_sorted = false
//把无序数组的边界更新为最后一次交换元素的位置
last_exchange_index = j
}
}
sort_boeder = last_exchange_index
if is_sorted {
break
}
}
}
//鸡尾酒排序,适用于大部分数组元素已经有序的场景
func cock_tail_sort(arrry []int) {
for i := 0; i < len(arrry)/2; i++ {
//有序标记,每一轮的初始是true
var is_sorted bool = true
// 奇数轮,从左到右进行比较和交换
for j := 0; j < len(arrry)-1-i; j++ {
if arrry[j] > arrry[j+1] {
temp := arrry[j]
arrry[j] = arrry[j+1]
arrry[j+1] = temp
//有元素交换,所以不是有序的,标记为false
is_sorted = false
}
}
if is_sorted {
break
}
//偶数论之前,重新标记为TRUE
is_sorted = true
for j := len(arrry) - i - 1 - 1; j > i; j-- {
if arrry[j] < arrry[j+1] {
temp := arrry[j]
arrry[j] = arrry[j-1]
arrry[j-1] = temp
//有元素交换,所以不是有序的,标记为false
is_sorted = false
}
}
if is_sorted {
break
}
}
}