常见排序算法解析与性能对比

排序算法概述

排序算法是计算机科学中的基础算法之一,用于将一组数据按照特定顺序(升序或降序)排列。常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。不同算法在时间复杂度和空间复杂度上各有优劣,适用于不同场景。

冒泡排序

冒泡排序通过多次遍历数组,比较相邻元素并交换位置,将较大(或较小)的元素逐步“冒泡”到数组末端。其时间复杂度为O(n2),适合小规模数据排序。

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

选择排序

选择排序每次从未排序部分选择最小(或最大)元素,放到已排序部分的末尾。时间复杂度同样为O(n2),但交换次数较少。

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

插入排序

插入排序将数组分为已排序和未排序两部分,逐个将未排序元素插入到已排序部分的正确位置。时间复杂度为O(n2),但在接近有序的数组上表现较好。

func InsertionSort(arr []int) {
    n := len(arr)
    for i := 1; i < n; 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 log n),但在最坏情况下退化为O(n2)。

func QuickSort(arr []int) {
    if len(arr) <= 1 {
        return
    }
    pivot := arr[0]
    left, right := []int{}, []int{}
    for i := 1; i < len(arr); i++ {
        if arr[i] < pivot {
            left = append(left, arr[i])
        } else {
            right = append(right, arr[i])
        }
    }
    QuickSort(left)
    QuickSort(right)
    arr = append(append(left, pivot), right...)
}

归并排序

归并排序同样基于分治思想,将数组分为两半,分别排序后合并。时间复杂度稳定为O(n log n),但需要额外空间。

func MergeSort(arr []int) []int {
    if len(arr) <= 1 {
        return arr
    }
    mid := len(arr) / 2
    left := MergeSort(arr[:mid])
    right := MergeSort(arr[mid:])
    return merge(left, right)
}

func merge(left, right []int) []int {
    result := []int{}
    i, j := 0, 0
    for i < len(left) && j < len(right) {
        if left[i] < right[j] {
            result = append(result, left[i])
            i++
        } else {
            result = append(result, right[j])
            j++
        }
    }
    result = append(result, left[i:]...)
    result = append(result, right[j:]...)
    return result
}

堆排序

堆排序利用堆数据结构,通过构建最大堆或最小堆实现排序。时间复杂度为O(n log n),且为原地排序。

func HeapSort(arr []int) {
    n := len(arr)
    for i := n/2 - 1; i >= 0; i-- {
        heapify(arr, n, i)
    }
    for i := n - 1; i > 0; i-- {
        arr[0], arr[i] = arr[i], arr[0]
        heapify(arr, i, 0)
    }
}

func heapify(arr []int, n, i int) {
    largest := i
    left := 2*i + 1
    right := 2*i + 2
    if left < n && arr[left] > arr[largest] {
        largest = left
    }
    if right < n && arr[right] > arr[largest] {
        largest = right
    }
    if largest != i {
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)
    }
}

算法性能对比

不同排序算法在不同场景下表现各异。以下为常见排序算法的性能对比:

  • 时间复杂度
    • 冒泡、选择、插入排序:O(n2)
    • 快速、归并、堆排序:O(n log n)
  • 空间复杂度
    • 冒泡、选择、插入、堆排序:O(1)
    • 快速排序:O(log n)(递归栈)
    • 归并排序:O(n)
  • 稳定性
    • 稳定:冒泡、插入、归并排序
    • 不稳定:选择、快速、堆排序

实际应用建议

  • 小规模数据:插入排序或冒泡排序
  • 大规模数据:快速排序或归并排序
  • 内存受限:堆排序
  • 数据接近有序:插入排序

以上实现和对比为Go语言中常见的排序算法提供了基础参考,实际应用中可根据具体需求选择或优化算法。

5G.okacbd121.asia/PoSt/1123_763755.HtM
5G.okacbd122.asia/PoSt/1123_505386.HtM
5G.okacbd123.asia/PoSt/1123_442477.HtM
5G.okacbd124.asia/PoSt/1123_152238.HtM
5G.okacbd125.asia/PoSt/1123_175965.HtM
5G.okacbd126.asia/PoSt/1123_686025.HtM
5G.okacbd127.asia/PoSt/1123_583599.HtM
5G.okacbd128.asia/PoSt/1123_122739.HtM
5G.okacbd129.asia/PoSt/1123_565023.HtM
5G.okacbd130.asia/PoSt/1123_754209.HtM
5G.okacbd121.asia/PoSt/1123_353854.HtM
5G.okacbd122.asia/PoSt/1123_511601.HtM
5G.okacbd123.asia/PoSt/1123_903454.HtM
5G.okacbd124.asia/PoSt/1123_994465.HtM
5G.okacbd125.asia/PoSt/1123_960575.HtM
5G.okacbd126.asia/PoSt/1123_948114.HtM
5G.okacbd127.asia/PoSt/1123_056937.HtM
5G.okacbd128.asia/PoSt/1123_519227.HtM
5G.okacbd129.asia/PoSt/1123_365272.HtM
5G.okacbd130.asia/PoSt/1123_592016.HtM
5G.okacbd131.asia/PoSt/1123_817430.HtM
5G.okacbd132.asia/PoSt/1123_083009.HtM
5G.okacbd133.asia/PoSt/1123_782356.HtM
5G.okacbd134.asia/PoSt/1123_134276.HtM
5G.okacbd135.asia/PoSt/1123_242620.HtM
5G.okacbd136.asia/PoSt/1123_547681.HtM
5G.okacbd137.asia/PoSt/1123_088622.HtM
5G.okacbd138.asia/PoSt/1123_941143.HtM
5G.okacbd139.asia/PoSt/1123_777224.HtM
5G.okacbd140.asia/PoSt/1123_515375.HtM
5G.okacbd131.asia/PoSt/1123_714948.HtM
5G.okacbd132.asia/PoSt/1123_595658.HtM
5G.okacbd133.asia/PoSt/1123_680467.HtM
5G.okacbd134.asia/PoSt/1123_020664.HtM
5G.okacbd135.asia/PoSt/1123_918858.HtM
5G.okacbd136.asia/PoSt/1123_095837.HtM
5G.okacbd137.asia/PoSt/1123_657489.HtM
5G.okacbd138.asia/PoSt/1123_354920.HtM
5G.okacbd139.asia/PoSt/1123_368933.HtM
5G.okacbd140.asia/PoSt/1123_152677.HtM
5G.okacbd131.asia/PoSt/1123_507074.HtM
5G.okacbd132.asia/PoSt/1123_976105.HtM
5G.okacbd133.asia/PoSt/1123_299178.HtM
5G.okacbd134.asia/PoSt/1123_138450.HtM
5G.okacbd135.asia/PoSt/1123_975087.HtM
5G.okacbd136.asia/PoSt/1123_539086.HtM
5G.okacbd137.asia/PoSt/1123_338527.HtM
5G.okacbd138.asia/PoSt/1123_364541.HtM
5G.okacbd139.asia/PoSt/1123_758339.HtM
5G.okacbd140.asia/PoSt/1123_542967.HtM
5G.okacbd131.asia/PoSt/1123_844513.HtM
5G.okacbd132.asia/PoSt/1123_973610.HtM
5G.okacbd133.asia/PoSt/1123_687269.HtM
5G.okacbd134.asia/PoSt/1123_932124.HtM
5G.okacbd135.asia/PoSt/1123_069160.HtM
5G.okacbd136.asia/PoSt/1123_220685.HtM
5G.okacbd137.asia/PoSt/1123_020974.HtM
5G.okacbd138.asia/PoSt/1123_459843.HtM
5G.okacbd139.asia/PoSt/1123_420267.HtM
5G.okacbd140.asia/PoSt/1123_718345.HtM
5G.okacbd131.asia/PoSt/1123_258632.HtM
5G.okacbd132.asia/PoSt/1123_364738.HtM
5G.okacbd133.asia/PoSt/1123_842230.HtM
5G.okacbd134.asia/PoSt/1123_220810.HtM
5G.okacbd135.asia/PoSt/1123_604970.HtM
5G.okacbd136.asia/PoSt/1123_068673.HtM
5G.okacbd137.asia/PoSt/1123_107557.HtM
5G.okacbd138.asia/PoSt/1123_845927.HtM
5G.okacbd139.asia/PoSt/1123_688318.HtM
5G.okacbd140.asia/PoSt/1123_777988.HtM
5G.okacbd131.asia/PoSt/1123_152426.HtM
5G.okacbd132.asia/PoSt/1123_858447.HtM
5G.okacbd133.asia/PoSt/1123_949004.HtM
5G.okacbd134.asia/PoSt/1123_056256.HtM
5G.okacbd135.asia/PoSt/1123_277618.HtM
5G.okacbd136.asia/PoSt/1123_551711.HtM
5G.okacbd137.asia/PoSt/1123_512615.HtM
5G.okacbd138.asia/PoSt/1123_639826.HtM
5G.okacbd139.asia/PoSt/1123_561186.HtM
5G.okacbd140.asia/PoSt/1123_089021.HtM

#牛客AI配图神器#

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务