堆排序

165 阅读1分钟

堆排序。时间复杂度O(nlognnlogn)。空间复杂度O(1)。原地排序。非稳定排序。

代码如下(已在leetcode提交通过)。题目链接

func sortArray(nums []int) []int {
    l := len(nums)
    if l < 2 {
        return nums
    }
    end := l-1
    // 整体堆化
    for i := (end-1)/2; i >= 0; i-- {
        heapify(nums, i, end)
    }
    // 排序
    for i := end; i > 0; i-- {
        nums[0], nums[i] = nums[i], nums[0]
        heapify(nums, 0, i-1)
    }
    return nums
}

// 堆化
func heapify(a []int, b, e int) {
    var (
        p = b
        pv = a[p]
    )
    for {
        child := 2*p+1
        if child > e {
            break
        }
        if child+1 <= e && a[child+1] > a[child] {
            child++
        }
        if pv >= a[child] {
            break
        }
        a[p] = a[child]
        p = child
    }
    a[p] = pv
}