这里是关于“Go语言展现快速排序算法全过程的思路及代码示例”的详细攻略。
什么是快速排序算法
快速排序算法是一种基于比较的排序算法,它通过选择一个基准元素,将数组分为两部分然后递归地对这两部分进行排序,最终完成对整个数组的排序。快速排序算法的时间复杂度为 O(nlogn) 平均情况下,但是在最坏情况下会退化为 O(n^2)。
快速排序算法的实现思路
下面是快速排序算法的实现思路:
- 首先选定一个基准数,一般选择数组的第一个数。从数组的右端开始往左扫描,找到第一个比基准数小的数,然后交换这两个数的位置。接着从左端开始往右扫描,找到第一个比基准数大的数,然后交换这两个数的位置。当左右两端的扫描相遇时,将基准数和扫描相遇位置的数交换,这样就将数组分成了两部分,左半部分的所有数都比基准数小,右半部分的所有数都比基准数大。
- 对两部分分别进行递归调用快速排序算法,重复上述过程,直到排序完成。
大体思路就是这样,下面我们来看一下 Go 语言的实现。
Go语言展现快速排序算法全过程的代码示例
下面是 Go 语言实现快速排序算法的代码示例:
func quickSort(arr []int, left, right int) {
if left >= right {
return
}
i, j, pivot := left, right, arr[left]
for i < j {
for i < j && arr[j] >= pivot {
j--
}
arr[i] = arr[j]
for i < j && arr[i] <= pivot {
i++
}
arr[j] = arr[i]
}
arr[i] = pivot
quickSort(arr, left, i-1)
quickSort(arr, i+1, right)
}
func main() {
arr := []int{3, 4, 2, 7, 10, 8, 1, 9, 5, 6}
quickSort(arr, 0, len(arr)-1)
fmt.Println(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
}
以上是一个普通的快速排序算法的实现,但在实际应用中,为了防止快速排序的最坏情况,我们可以通过随机选择基准数来提高算法的效率:如下所示
import (
"fmt"
"math/rand"
"time"
)
func quickSort(arr []int, lo, hi int) {
if lo >= hi {
return
}
pivotIndex := partition(arr, lo, hi)
quickSort(arr, lo, pivotIndex-1)
quickSort(arr, pivotIndex+1, hi)
}
func partition(arr []int, lo, hi int) int {
rand.Seed(time.Now().UnixNano()) // 添加随机值
randPivot := lo + rand.Intn(hi-lo+1) // 选择随机基准数
arr[lo], arr[randPivot] = arr[randPivot], arr[lo] // 将随机基准数与首元素交换
pivot := arr[lo]
i := lo + 1
for j := lo + 1; j <= hi; j++ {
if arr[j] < pivot {
arr[i], arr[j] = arr[j], arr[i]
i++
}
}
arr[lo], arr[i-1] = arr[i-1], arr[lo]
return i - 1
}
func main() {
arr := []int{3, 4, 2, 7, 10, 8, 1, 9, 5, 6}
quickSort(arr, 0, len(arr)-1)
fmt.Println(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
}
这个示例中,我们引入了一个随机数作为基准 pivot,然后将其与数组第一个数进行交换以实现随机的效果。这样就避免了最坏情况的发生,提高了算法的效率。
另外,为了更好的说明快速排序的过程,这里再介绍一个使用递归调用的快速排序算法示例,其中可以看到每一次递归都会执行交换操作,以表现出快速排序算法的全过程。
package main
import (
"fmt"
)
func main() {
arr := []int{3, 4, 2, 7, 10, 8, 1, 9, 5, 6}
fmt.Println("排序前:", arr)
quickSort(arr, 0, len(arr)-1)
}
func quickSort(arr []int, left, right int) {
if left < right {
pivotIndex := partition(arr, left, right)
fmt.Println("分区后:", arr)
quickSort(arr, left, pivotIndex-1)
quickSort(arr, pivotIndex+1, right)
}
}
func partition(arr []int, left, right int) int {
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
}
以上是关于 Go 语言展示快速排序算法全过程的两条示例说明,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言展现快速排序算法全过程的思路及代码示例 - Python技术站