go的快速排序怎么写
时间: 2023-09-15 18:05:31 浏览: 158
### 回答1:
Go 语言的快速排序可以使用以下代码实现:
```
func quickSort(values []int, left, right int) {
temp := values[left]
p := left
i, j := left, right
for i <= j {
for j >= p && values[j] >= temp {
j--
}
if j >= p {
values[p] = values[j]
p = j
}
for i <= p && values[i] <= temp {
i++
}
if i <= p {
values[p] = values[i]
p = i
}
}
values[p] = temp
if p-left > 1 {
quickSort(values, left, p-1)
}
if right-p > 1 {
quickSort(values, p+1, right)
}
}
```
使用时,你可以这样调用:
```
values := []int{9, 8, 7, 6, 5, 4, 3, 2, 1}
quickSort(values, 0, len(values)-1)
fmt.Println(values)
```
### 回答2:
快速排序是一种高效的排序算法,它的思想是通过选择一个基准元素将待排序序列分成两个子序列,将小于基准的元素放到左边,大于基准的元素放到右边,然后对左右子序列递归地进行快速排序。
以下是用Go语言编写快速排序算法的示例代码:
```go
package main
import "fmt"
func quickSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
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])
}
}
// 递归地对左右子序列进行快速排序,并将结果合并
return append(append(quickSort(left), pivot), quickSort(right)...)
}
func main() {
arr := []int{5, 3, 8, 6, 2, 9, 1, 4, 7}
fmt.Println("排序前:", arr)
arr = quickSort(arr)
fmt.Println("排序后:", arr)
}
```
以上代码中,首先定义了一个名为`quickSort`的函数,该函数接受一个整数切片作为参数。在函数体内,首先检查切片的长度,如果长度小于等于1,则直接返回该切片。
然后选择第一个元素作为基准,并定义了两个空的切片`left`和`right`。遍历剩余的元素,将小于基准的元素放到`left`切片中,将大于等于基准的元素放到`right`切片中。
最后,采用递归的方式对左右子序列进行快速排序,并将排序后的结果合并,即将`left`切片、基准元素和`right`切片依次加入到一个新的切片中。
在`main`函数中我们定义一个待排序的整数切片`arr`,并调用`quickSort`函数进行排序。排序前输出原始序列,排序后输出排序结果。
执行上述代码,将会得到如下输出:
```
排序前: [5 3 8 6 2 9 1 4 7]
排序后: [1 2 3 4 5 6 7 8 9]
```
可以看到,快速排序算法能够按照升序对整数序列进行正确排序。
### 回答3:
快速排序(Quick Sort)是一种常用的排序算法,它利用分治的思想将一个待排序的数组分割成两个子序列,其中一个子序列小于等于基准元素,另一个子序列大于基准元素,然后递归地对两个子序列进行排序,最后合并得到有序数组。
在Go语言中,实现快速排序可以按照以下步骤进行:
1. 定义一个函数quickSort,接收一个整型切片参数arr作为待排序的数组。
2. 在quickSort函数内部,判断切片长度是否小于等于1,若是则直接返回。
3. 选择基准元素,一般可以选取切片的中间元素,将其从切片中移除,并用变量pivot保存基准元素的值。
4. 初始化两个空切片left和right,用于保存小于基准元素和大于基准元素的子序列。
5. 遍历原数组arr,若元素小于基准元素,则将该元素追加到left切片中;若元素大于基准元素,则将该元素追加到right切片中。
6. 递归调用quickSort函数,分别对left和right切片进行排序。
7. 将排好序的left切片、基准元素和排好序的right切片按顺序合并为一个新的切片result。
8. 返回新的切片result作为排序后的结果。
以下是快速排序的Go语言实现示例代码:
```go
package main
import "fmt"
func quickSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
pivot := arr[len(arr)/2]
arr = append(arr[:len(arr)/2], arr[len(arr)/2+1:]...)
var left, right []int
for _, v := range arr {
if v < pivot {
left = append(left, v)
} else {
right = append(right, v)
}
}
return append(append(quickSort(left), pivot), quickSort(right)...)
}
func main() {
arr := []int{7, 2, 1, 6, 8, 5, 3, 4}
fmt.Println("Before sorting:", arr)
arr = quickSort(arr)
fmt.Println("After sorting:", arr)
}
```
以上代码实现了快速排序算法,先定义了一个quickSort函数,然后通过main函数进行测试。运行结果为:
```
Before sorting: [7 2 1 6 8 5 3 4]
After sorting: [1 2 3 4 5 6 7 8]
```
这说明快速排序算法对原始数组进行了排序。
阅读全文