排序

快速排序

主要思想,就是第一个元素作为基准数据,将其他数据比较,分为左和右数组,递归

func quickSort(arr []int) (ret []int) {
	if len(arr) <= 1 {		
		return arr
	}
	left := []int{}
	right := []int{}
	mid := arr[0]

	for i:=1; i<len(arr); i++ {
		if arr[i] < mid {
			left = append(left, arr[i])
		} else {
			right = append(right, arr[i])
		}
	}

	ret = append(ret, quickSort(left)...)
	ret = append(ret, mid)
	ret = append(ret, quickSort(right)...)
	return
}

堆排序

步骤:

  • 构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。
  • 将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换

堆特性:

  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树。

堆是非线性数据结构,相当于一维数组,有两个直接后继。
堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2)

func main() {

	arr := []int{4,5,8,2,3,9,7,1}

	for i:=len(arr)/2-1; i>=0; i-- {
		maxHeap(arr, i, len(arr)-1)
	}
	for i := len(arr) - 1; i > 0; i-- {
        arr[0], arr[i] = arr[i], arr[0]
        maxHeap(arr, 0, i - 1);
    }
	
	fmt.Println(arr)
}

func maxHeap(arr []int, start, end int) {
	dad := start
	son := 2*dad+1
	for son <= end {
		if son+1 <= end && arr[son] < arr[son+1] {
			son++
		}
		if arr[dad] > arr[son] {
			return
		}		
		arr[son], arr[dad] = arr[dad], arr[son]
		dad = son;
        son = dad * 2 + 1;
	}
	return
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值