一、鸡尾酒排序与冒泡排序的对比:
鸡尾酒排序的优点是在特定的条件下减少排序的回合数,而缺点也很明显,代码量几乎扩大了一倍
鸡尾酒排序适用场景:大部分元素已经有序的情况下
二、代码:
//鸡尾酒排序(快乐小时排序)
func cocktailSort(array []int) []int {
tmp := 0
for i := 0; i < len(array)/2; i++ {
isSorted := true //有序标记,每一轮的出事是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 //有元素交换,所以不是有序的,标记为false
}
}
if isSorted {
break
}
isSorted = true //偶数轮之前,重新标记为true
//偶数轮,从右向左比较交换
for j := len(array) - i - 1; j > i; 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 cocktailSort2(array []int) []int {
tmp := 0
lastRightExchangeIndex := 0 //记录右侧最后以此交换位置
lastLeftExchangeIndex := 0 //记录左侧最后一次交换为止
rightSortBorder := 0 //无序数列的右边界,每次比较只需比较到这里
leftSortBorder := len(array) - 1 //无序数列的左边界,每次比较只需比较到这里
for i := 0; i < len(array)/2; i++ {
isSortBorder := true
for j := leftSortBorder; j < rightSortBorder; j++ {
if array[j] > array[j+1] {
tmp = array[i]
array[i] = array[i+1]
array[i+1] = tmp
isSortBorder = false
lastRightExchangeIndex = j
}
}
rightSortBorder = lastRightExchangeIndex
if isSortBorder {
break
}
isSortBorder = true
for j := rightSortBorder; j > leftSortBorder; j-- {
if array[j] < array[j-1] {
tmp = array[j]
array[j] = array[j-1]
array[j-1] = tmp
isSortBorder = false
lastLeftExchangeIndex = j
}
}
leftSortBorder = lastLeftExchangeIndex
if isSortBorder {
break
}
}
return array
}
func main() {
array := []int{2, 3, 4, 5, 6, 7, 8, 1}
newArr := cocktailSort(array)
fmt.Println(newArr)
newArr2 := cocktailSort2(array)
fmt.Println(newArr2)
}