golang实现常用排序算法 - Go语言中文社区

golang实现常用排序算法


1.冒泡排序,算法复杂度O(n^2)

package main

import (
    "fmt"
)

func main() {
    var arr = []int{10, 17, 19, 18, 77, 55}
    for i := 0; i < len(arr)-1; i++ {
        for j := i + 1; j < len(arr); j++ {
            if arr[i] > arr[j] {
                arr[i], arr[j] = arr[j], arr[i]
            }
        }
    }
    fmt.Println(arr)
}

2.快速排序

它的基本思想是:通过一趟排序将数据一分为二,其中一部分的所有数据都比另外一部分的所有数据都要小,然后对两部分递归,直至完成。时间复杂度介于O(nlogn)和O(n^2)

一趟快速排序的算法是:

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];

3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]赋给A[i];

4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]赋给A[j];

5)重复第3、4步,直到i=j;

package main

import (
    "fmt"
)

func main() {
    quictSort()
}

func quictSort() {
    var arr = []int{50, 66, 44, 99, 77, 24}
    recurtion(arr, 0, len(arr)-1)
    fmt.Println(arr)
}

func recurtion(arr []int, left int, right int) {
    if left < right {
        var i, j = left, right
        var key = arr[i]
        for i < j {
            for i < j && arr[j] >= key {
                j--
            }
            arr[i] = arr[j]
            for i < j && arr[i] <= key {
                i++
            }
            arr[j] = arr[i]
        }
        arr[i] = key
        recurtion(arr, left, i-1)
        recurtion(arr, i+1, right)
    }
}


3.插入排序

时间复杂度O(n^2),不适合大量数据处理

从第二个值开始遍历,与前面的有序列比较,若比前面值小则交换

package main

import (
    "fmt"
)

func main() {
    insertSort()
}

func insertSort() {
    var arr = []int{50, 66, 44, 99, 77, 24}
    for i := 1; i < len(arr); i++ {
        for j := 0; j < i; j++ {
            if arr[i] < arr[j] {
                arr[i], arr[j] = arr[j], arr[i]
            }
        }
    }
    fmt.Println(arr)
}

4.归并排序 算法复杂度O(nlogn)

是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。

package main

import "fmt"

func main() {
    arr := []int{39, 19, 28, 6, 44, 77, 15}
    mergeSort(arr, 0, len(arr)-1)
    fmt.Println(arr)
}
func merge(arr []int, first, mid, last int) {
    buf := make([]int, last+1)
    i := first
    j := mid + 1
    var num int = first
    for i <= mid && j <= last {
        if arr[i] < arr[j] {
            buf[num] = arr[i]
            i++
        } else {
            buf[num] = arr[j]
            j++
        }
        num++
    }
    for i <= mid {
        buf[num] = arr[i]
        num++
        i++
    }
    for j <= last {
        buf[num] = arr[j]
        num++
        j++
    }
    copy(arr[first:], buf[first:])
}
func mergeSort(arr []int, first, last int) {
    if first < last {
        mid := (first + last) / 2
        mergeSort(arr, first, mid)
        mergeSort(arr, mid+1, last)
        merge(arr, first, mid, last)
    }
}

转载于:https://my.oschina.net/u/1383471/blog/624747

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_34122604/article/details/92090230
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-27 19:05:04
  • 阅读 ( 1747 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢