首页 > 编程语言 > 详细

排序:快排和固定堆

时间:2021-04-12 16:55:13      阅读:34      评论:0      收藏:0      [点我收藏+]

技术分享图片

随机快排

/**
 * 方法一:随机快速排序
 */
class Solution {
    public int findKthLargest(int[] nums, int k) {
        //(1)随机快排
        sort(nums, 0, nums.length - 1);
        //(2)下标从0开始则-1
        return nums[k - 1];
    }

    private void sort(int[] nums, int left, int right) {
        if (left < right) {
            int pivotIndex = partition(nums, left, right);
            sort(nums, left, pivotIndex - 1);
            sort(nums, pivotIndex + 1, right);
        }
    }

    private int partition(int[] nums, int left, int right) {
        swap(nums, left, (left + right) >> 1);
        int pivot = left;
        int index = pivot + 1;
        for (int i = index; i <= right; i++) {
            if (nums[i] > nums[pivot]) {
                swap(nums, i, index);
                index++;
            }
        }
        swap(nums, index - 1, pivot);
        return index - 1;
    }

    private void swap(int[] nums, int i1, int i2) {
        if (i1 == i2) {
            return;
        }
        int tmp = nums[i1];
        nums[i1] = nums[i2];
        nums[i2] = tmp;
    }
}

固定堆

/**
 * 方法二:固定堆
 */
public class Solution2 {
    public int findKthLargest(int[] nums, int k) {
        //(1)初始化固定堆
        FixSmallHeap heap = new FixSmallHeap(k + 1);
        for (int i = 0; i < nums.length; i++) {
            if (!heap.push(nums[i])) {
                heap.pop();
                heap.push(nums[i]);
            }
        }
        //(2)当nums.length == k时则不需要pop
        if (heap.size == k + 1)
            heap.pop();
        //(3)返回第TopK元素
        return heap.peek();
    }

    //固定小顶堆
    class FixSmallHeap {
        public int size = 0;
        int[] queue;

        FixSmallHeap(int N) {
            queue = new int[N + 1];
        }

        public boolean push(int val) {
            //超过堆的容量则返回false。PS:-1是因为元素从1开始计算
            if (size == queue.length - 1)
                return false;
            queue[++size] = val;
            shiftUp(size);
            return true;
        }

        public int pop() {
            int val = queue[1];
            queue[1] = queue[size];
            queue[size--] = 0;
            shiftDown(1);
            return val;
        }

        public int peek() {
            return queue[1];
        }

        private void shiftUp(int i) {
            int temp = queue[i];
            while ((i >> 1) > 0) {
                int parent = i >> 1;
                if (temp < queue[parent]) {
                    queue[i] = queue[parent];
                    i = parent;
                } else {
                    break;
                }
            }
            queue[i] = temp;
        }

        private void shiftDown(int i) {
            int temp = queue[i];
            while ((i << 1) <= size) {
                int child = i << 1;
                if (child != size && queue[child + 1] < queue[child])
                    child++;
                if (temp > queue[child]) {
                    queue[i] = queue[child];
                    i = child;
                } else {
                    break;
                }
            }
            queue[i] = temp;
        }
    }
}

排序:快排和固定堆

原文:https://www.cnblogs.com/ming-michelle/p/14647555.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!