说明:使用递归实现,将一个大的问题划分为多个小的问题, 使用分治法的思想。 利用分治法将快速排序分为三步 1.选择基准值 2.将数组分为两个字数组:①小于基准值的元素组成的数组,②大于基准值的元素组成的数组 3.对两个子数组进行快速排序(递归) 递归的两要素: 1.基线条件(即递归停止的条件): len(numlist) < 2 2.递归条件(函数调用自己的条件):len(numlist) >=2
package main
import "fmt"
func main() {
var mylist []int = []int{9, 7, 5, 21, 15, 16, 4, 2, 7}
fmt.Println("排序前:", mylist)
newlist := quicksort(mylist)
fmt.Println("排序后:", newlist)
}
//选择排序
func selectionSort(numlist []int) []int {
var newarr []int
numlen := len(numlist)
for i := 0; i < numlen; i++ {
minindex := searchMin(numlist)
newarr = append(newarr, numlist[minindex])
fmt.Println(numlist[minindex])
temp := numlist[minindex+1:]
numlist = append(numlist[:minindex], temp...)
}
return newarr
}
func searchMin(numlist []int) int {
min := numlist[0]
minindex := 0
for i := 1; i < len(numlist); i++ {
if numlist[i] < min {
min = numlist[i]
minindex = i
}
}
return minindex
}
//快速排序-分治法
func quicksort(numlist []int) []int {
var pivot int
if len(numlist) < 2 {
return numlist
} else {
pivot = numlist[0]
var less, greater []int
for _, v := range numlist[1:] { //基准数不用遍历
if v <= pivot {
less = append(less, v)
} else {
greater = append(greater, v)
}
}
newarr := append(append(quicksort(less), pivot), quicksort(greater)...) //less + pivot + greater重组为一个数
return newarr
}
}
运行结果