快速排序
主要思想,就是第一个元素作为基准数据,将其他数据比较,分为左和右数组,递归
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
}