美文网首页
常见的排序算法-1.冒泡排序算法

常见的排序算法-1.冒泡排序算法

作者: yulekwok | 来源:发表于2020-04-19 23:03 被阅读0次

    冒泡排序(Bubble Sort)

    冒泡排序也叫做起泡排序
    执行流程
    1 从头开始比较每一对相邻元素,如果第1个比第2个大,就交换它们的位置 ✓ 执行完一轮后,最末尾那个元素就是最大的元素
    2 忽略 1 中曾经找到的最大元素,重复执行步骤 1,直到全部元素有序
    //最坏、平均时间复杂度:O(n2) 最好时间复杂度:O(n)
    //空间复杂度:O(1)

    for end := len(this.Array) - 1; end > 0; end-- {
            for begin := 1; begin <= end; begin++ {
                if this.ComWithIndex(begin, begin-1) < 0 {
                    this.Swap(begin, begin-1)
                }
            }
        }
    

    冒泡排序 – 优化1

    如果序列已经完全有序,可以提前终止冒泡排序,相当于提前进行终止

    for end := len(this.Array) - 1; end > 0; end-- {
            sorted := true
            for begin := 1; begin <= end; begin++ {
                if this.ComWithIndex(begin, begin-1) < 0 {
                    this.Swap(begin, begin-1)
                    sorted = false
                }
            }
            if sorted{
                break
            }
    
        }
    

    冒泡排序 – 优化2

    如果序列尾部已经局部有序,可以记录最后1次交换的位置,减少比较次数

    for end := len(this.Array) - 1; end > 0; end-- {
            sortedIndex := 1
            for begin := 1; begin <= end; begin++ {
                if this.ComWithIndex(begin, begin-1) < 0 {
                    this.Swap(begin, begin-1)
                    sortedIndex = begin
                }
            }
            end = sortedIndex
        }
    

    golang 源码

    package mysort
    
    import "fmt"
    
    type Sort struct {
        Array     []int
        CmpCount  int64
        SwapCount int64
    }
    
    func (this *Sort) SortArray(array []int)  {
    
        this.Array = make([]int, len(array))
        copy(this.Array, array)
    
    }
    func (this *Sort) SortFunc() {
        if this.Array == nil || len(this.Array) < 2 {
            return
        }
    }
    func (this *Sort) ComWithIndex(i1, i2 int) int {
        this.CmpCount++
        return this.Array[i1] - this.Array[i2]
    }
    func (this *Sort) ComWithValue(v1, v2 int) int {
        this.CmpCount++
        return v1 - v2
    }
    func (this *Sort) Swap(i1, i2 int) {
        this.SwapCount++
        this.Array[i2], this.Array[i1] = this.Array[i1], this.Array[i2]
    }
    func (this *Sort)ToString()  {
        fmt.Println("排序比较次数",this.CmpCount,"排序交换次数",this.SwapCount)
    
    }
    
    
    package mysort
    
    type BubbleSort struct {
        Sort
    }
    
    func (this *BubbleSort) SortArray(array []int) {
        this.Sort.SortArray(array)
    }
    func (this *BubbleSort) SortFunc()  {
        this.Sort.SortFunc()
        for end := len(this.Array) - 1; end > 0; end-- {
            for begin := 1; begin <= end; begin++ {
                if this.ComWithIndex(begin, begin-1) < 0 {
                    this.Swap(begin, begin-1)
                }
            }
        }
    
    }
    // 设置一个bool 的标志,判断是否进行过交换
    func (this *BubbleSort) SortFunc1()  {
        this.Sort.SortFunc()
        for end := len(this.Array) - 1; end > 0; end-- {
            sorted := true
            for begin := 1; begin <= end; begin++ {
                if this.ComWithIndex(begin, begin-1) < 0 {
                    this.Swap(begin, begin-1)
                    sorted = false
                }
            }
            if sorted{
                break
            }
    
        }
    
    }
    func (this *BubbleSort) SortFunc2()  {
        this.Sort.SortFunc()
        for end := len(this.Array) - 1; end > 0; end-- {
            sortedIndex := 1
            for begin := 1; begin <= end; begin++ {
                if this.ComWithIndex(begin, begin-1) < 0 {
                    this.Swap(begin, begin-1)
                    sortedIndex = begin
                }
            }
            end = sortedIndex
        }
    
    }
    
    package main
    
    import (
        "fmt"
        "iktolin.com/mysort"
        "math/rand"
        "time"
    )
    
    func main()  {
        var array []int
        rand.Seed(time.Now().UnixNano())
        for i := 0; i < 40; i++ {
            x := rand.Intn(100)
            array = append(array, x)
    
        }
    
    
        fmt.Println("排序前",array)
        // 时间复杂度 O(n2)
        bubbleSort := mysort.BubbleSort{}
        bubbleSort.SortArray(array)
        bubbleSort.SortFunc()
        bubbleSort.ToString()
        //fmt.Println(array)
        // 使用bool 值判断是否进行过排序,适用于原来就是排好序的
        bubbleSort1 := mysort.BubbleSort{}
        bubbleSort1.SortArray(array)
        bubbleSort1.SortFunc1()
        bubbleSort1.ToString()
        // 使用bool 值判断是否进行过排序,适用于其中有局部排好序的
        bubbleSort2 := mysort.BubbleSort{}
        bubbleSort2.SortArray(array)
        bubbleSort2.SortFunc2()
        bubbleSort2.ToString()
    }
    
    
    //排序前 [54 37 92 86 57 91 57 36 95 85 57 96 79 71 14 3 84 10 92 14 38 24 47 34 91 48 76 42 4 4 23 6 0 49 47 24 26 54 85 52]
    //排序比较次数 780 排序交换次数 478
    //排序比较次数 759 排序交换次数 478
    //排序比较次数 689 排序交换次数 478
    

    相关文章

      网友评论

          本文标题:常见的排序算法-1.冒泡排序算法

          本文链接:https://www.haomeiwen.com/subject/lslgphtx.html