Go排序算法 | 青训营笔记

45 阅读2分钟

Go语言是一门快速、简单且易于学习的编程语言,广泛应用于开发高性能的应用程序。在这门语言中,排序算法是一个非常重要的主题。本文将介绍Go语言中常见的几种排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。

  1. 冒泡排序

冒泡排序是一种基础的排序算法,在数据规模较小时表现良好。它的原理是比较相邻元素的值,并根据需要交换它们的位置,直到整个序列都被扫描完毕。具体实现如下:

func bubbleSort(arr []int) {
    for i := 0; i < len(arr)-1; i++ {
        for j := 0; j < len(arr)-i-1; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }
        }
    }
}

该算法的时间复杂度为O(n^2),空间复杂度为O(1)。

  1. 选择排序

选择排序是另一种基础的排序算法,在数据规模较大时表现较好。它的原理是每次从未排序部分选出最小的元素,并与已排序部分的末尾元素交换位置。具体实现如下:

func selectionSort(arr []int) {
    for i := 0; i < len(arr)-1; i++ {
        minIndex := i
        for j := i + 1; j < len(arr); j++ {
            if arr[j] < arr[minIndex] {
                minIndex = j
            }
        }
        arr[i], arr[minIndex] = arr[minIndex], arr[i]
    }
}

该算法的时间复杂度为O(n^2),空间复杂度为O(1)。

  1. 插入排序

插入排序是一种简单直观的排序算法,在小规模数据时表现良好。它的原理是将未排序部分的每一个元素插入到已排序部分的合适位置。具体实现如下:

func insertionSort(arr []int) {
    for i := 1; i < len(arr); i++ {
        key := arr[i]
        j := i - 1
        for j >= 0 && arr[j] > key {
            arr[j+1] = arr[j]
            j--
        }
        arr[j+1] = key
    }
}

该算法的时间复杂度为O(n^2),空间复杂度为O(1)。

  1. 快速排序

快速排序是一种高效的排序算法,它的原理是选取一个元素作为基准值,将序列分成左右两部分,左边部分的元素都比基准值小,右边部分的元素都比基准值大,然后对左右两部分递归进行排序。具体实现如下:

func quickSort(arr []int, l int, r int) {
    if l < r {
        partitionIndex := partition(arr, l, r)
        quickSort(arr, l, partitionIndex-1)
        quickSort(arr, partitionIndex+1, r)
    }
}

func partition(arr []int, l int, r int) int {
    pivot := arr[r]
    i := l - 1
    for j := l; j < r; j++ {
        if arr[j] < pivot {
            i++
            arr[i], arr[j] = arr[j], arr[i]
        }
    }
    arr[i+1], arr[r] = arr[r], arr[i+1]
    return i + 1
}

该算法的时间复杂度为O(nlogn),空间复杂度为O(logn)。