golang实现快速排序

说明:使用递归实现,将一个大的问题划分为多个小的问题, 使用分治法的思想。

利用分治法将快速排序分为三步
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
	}
}

运行结果 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值