package main import "fmt" var arr = []int{1, 3, 4, 2, 6, 7, 8, 0, 10, 1231, 4194, 491, 10, 194, 48, 2, 34} func BubbleSort() { arrLen := len(arr) for i := 0; i < arrLen-1; i ++ { for j := 0; j < arrLen-i-1; j ++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] = arr[j+1], arr[j] } } } fmt.Println(arr) } /* 假设我们现在排序ar[]={1,2,3,4,5,6,7,8,10,9}这组数据, 按照上面的排序方式,第一趟排序后将10和9交换已经有序, 接下来的8趟排序就是多余的,什么也没做。所以我们可以在 交换的地方加一个标记,如果那一趟排序没有交换元素,说明 这组数据已经有序,不用再继续下去。 */ func BubbleSortV1() { arrLen := len(arr) for i := 0; i < arrLen-1; i ++ { flag := false for j := 0; j < arrLen-i-1; j ++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] = arr[j+1], arr[j] flag = true } } if !flag { break } } fmt.Println(arr) } /* 优化一仅仅适用于连片有序而整体无序的数据(例如:1, 2,3 ,4 ,7,6,5) 但是对于前面大部分是无序而后边小半部分有序的数据(1,2,5,7,4,3,6,8,9,10) 排序效率也不可观,对于种类型数据,我们可以继续优化。既我们可以记下最后一次交换的位置, 后边没有交换,必然是有序的,然后下一次排序从第一个比较到上次记录的位置结束即可。 */ func BubbleSortV2() { arrLen := len(arr) k := arrLen - 1 for i := 0; i < arrLen-1; i ++ { flag := false pos := 0 for j := 0; j < k; j ++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] = arr[j+1], arr[j] flag = true pos = j } } if !flag { break } k = pos } fmt.Println(arr) } /* 优化二的效率有很大的提升,还有一种优化方法可以继续提高效率。 大致思想就是一次排序可以确定两个值,正向扫描找到最大值交换到最后, 反向扫描找到最小值交换到最前面。例如:排序数据1,2,3,4,5,6,0 */ func BubbleSortV3() { arrLen := len(arr) k := arrLen - 1 n := 0 for i := 0; i < arrLen-1; i ++ { flag := false pos := 0 for j := n; j < k; j ++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] = arr[j+1], arr[j] flag = true pos = j } } if !flag { break } k = pos for j := k; j > n; j-- { if arr[j] < arr[j-1] { arr[j], arr[j-1] = arr[j-1], arr[j] flag = true } } n++ if !flag { break } } fmt.Println(arr) } func main() { //BubbleSort() //BubbleSortV1() //BubbleSortV2() BubbleSortV3() }
冒泡排序和优化 go实现
猜你喜欢
转载自blog.csdn.net/qq_28119741/article/details/88859490
今日推荐
周排行