ZBLOG

golang 快速排序

快速排序是一种常用的基于比较的排序算法,它的核心思想是通过选取一个基准值将待排序序列分成两部分,左半部分中所有元素小于等于基准值,右半部分中所有元素大于等于基准值。然后递归地对左右两个子序列进行排序。

以下是 golang 实现快速排序的示例代码:

func QuickSort(arr []int) {
    quickSort(arr, 0, len(arr)-1)
}

func quickSort(arr []int, left int, right int) {
    if left >= right {
        return
    }
    pivotIndex := partition(arr, left, right)
    quickSort(arr, left, pivotIndex-1)
    quickSort(arr, pivotIndex+1, right)
}

// 划分函数
func partition(arr []int, left int, right int) int {
    // 以 arr[left] 为枢轴
    pivot := arr[left]
    for left < right {
        // 找到第一个比枢轴小的位置
        for left < right && arr[right] >= pivot {
            right--
        }
        arr[left] = arr[right]
        // 找到第一个比枢轴大的位置
        for left < right && arr[left] <= pivot {
            left++
        }
        arr[right] = arr[left]
    }
    // 将枢轴放置到正确位置上
    arr[left] = pivot
    return left
}

在该代码中,我们使用了递归实现快速排序,并且采用了 Lomuto 分区方法。具体实现步骤如下:

  1. 选取枢轴(pivot):选择待排序序列的第一个元素作为枢轴。

  2. 划分操作:将待排序序列分成两个子序列,左子序列中所有元素都小于等于枢轴,右子序列中所有元素都大于等于枢轴。

  3. 递归操作:对左右两个子序列进行快速排序,直至排序完成。

在划分操作中,我们从数组的两端开始查找比枢轴小和比枢轴大的元素,并交换它们的位置。当左右指针相遇时,将枢轴与当前位置进行交换即可完成一次划分。

时间复杂度:\(O(nlogn)\)

空间复杂度:\(O(logn)\)

稳定性:不稳定

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=6496

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?