排序

快速排序

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

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

	for i:=1; i

堆排序

步骤:

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

堆特性:

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

堆是非线性数据结构,相当于一维数组,有两个直接后继。
堆的定义如下: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
}

你可能感兴趣的:(语言开发,排序算法,算法)