funcQuickSorSort(arr []int, low, high int) { if low > high { return } l,h := low, high p := l + ((h - l) >> 1) key := arr[p] for l < h { for l < h && arr[h] > key { h-- } if l < h { arr[l] = arr[h] l++ }
for l < h && arr[l] < key { l++ } if l < h { arr[h] = arr[l] h-- } } arr[l] = key QuickSorSort(arr, low, l -1) QuickSorSort(arr, h + 1, high) }
堆排
堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义以下几种操作: 最大堆调整(Max Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点 创建最大堆(Build Max Heap):将堆中的所有数据重新排序 堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
funcHeapSort(arr []int) { var heapify func(arr []int, index , size int) heapify = func(arr []int, index ,size int) { left, right:= index*2 + 1,index*2 + 2 max := index if left < size && arr[left] > arr[index] { max = left } if right < size && arr[right] > arr[max] { max = right } // 找到左右子树中最大的一个进行交换 if max != index { arr[index], arr[max] = arr[max], arr[index] heapify(arr, max, size) } }
var buildHeap = func(arr []int) { size := len(arr) for i := size / 2; i >= 0; i-- { heapify(arr, i, size) } } size := len(arr) buildHeap(arr) for i := size - 1; i >0; i-- { arr[0], arr[i] = arr[i],arr[0] size-- heapify(arr, 0, size) } }