golang双指针快速排序的实现代码

admin 轻心小站 关注 LV.19 运营
发表于Go语言交流版块 教程

快速排序是一种高效的排序算法,使用分治法(Divide and Conquer)策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。在Go语言中,可以通过双指针技术实现快速排序,以下

快速排序是一种高效的排序算法,使用分治法(Divide and Conquer)策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。在Go语言中,可以通过双指针技术实现快速排序,以下是一个简单的快速排序实现示例:

package main

import (
	"fmt"
	"sort"
)

// 快速排序的交换函数
func swap(arr []int, i, j int) {
	arr[i], arr[j] = arr[j], arr[i]
}

// 分区函数,选择一个元素作为基准,并将小于基准的元素放在左边,大于基准的元素放在右边
func partition(arr []int, low, high int) int {
	// 选择最后一个元素作为基准
	pivot := arr[high]
	i := low - 1

	for j := low; j < high; j++ {
		// 如果当前元素小于或等于基准
		if arr[j] <= pivot {
			i++
			// 交换元素
			swap(arr, i, j)
		}
	}
	// 将基准元素放到正确的位置
	swap(arr, i+1, high)
	return i + 1
}

// QuickSort 函数,递归地对数组进行快速排序
func QuickSort(arr []int, low, high int) {
	if low < high {
		// pi 是分区索引,arr[pi] 现在在正确的位置
		pi := partition(arr, low, high)

		// 分别对基准前后的两个子数组进行排序
		QuickSort(arr, low, pi-1)
		QuickSort(arr, pi+1, high)
	}
}

func main() {
	// 示例数组
	arr := []int{10, 7, 8, 9, 1, 5}
	fmt.Println("原始数组:", arr)

	// 对数组进行快速排序
	QuickSort(arr, 0, len(arr)-1)

	fmt.Println("排序后的数组:", arr)
}

在这个实现中,QuickSort 函数是快速排序的主要逻辑,它接受一个数组以及要排序的部分的起始和结束索引。partition 函数用于将数组分成两部分,并返回基准值的正确位置。swap 函数用于交换两个元素的位置。

要使用这个快速排序算法,只需调用 QuickSort 函数并传入要排序的数组以及数组的起始和结束索引。在上面的 main 函数中,我们定义了一个示例数组,并在排序前后打印了它的内容。

请注意,这个实现并不是Go标准库中 sort 包的快速排序实现。Go的 sort 包使用了一种称为“混合排序”的算法,它在不同的情况下使用不同的排序算法(如插入排序、归并排序和快速排序)以获得最佳性能。如果你需要对切片进行排序,直接使用 sort.Sort 会更方便且性能更好:

sort.Ints(arr) // 对int类型的切片进行排序

使用Go标准库的 sort 包是大多数情况下的首选,因为它已经过优化,并且可以处理各种边缘情况。上面的快速排序实现主要用于学习和理解算法原理。

文章说明:

本文原创发布于探乎站长论坛,未经许可,禁止转载。

题图来自Unsplash,基于CC0协议

该文观点仅代表作者本人,探乎站长论坛平台仅提供信息存储空间服务。

评论列表 评论
发布评论

评论: golang双指针快速排序的实现代码

粉丝

0

关注

0

收藏

0

已有0次打赏