美文网首页
堆排序和topN算法

堆排序和topN算法

作者: laosijikaichele | 来源:发表于2018-06-05 13:24 被阅读454次

堆排序和topN算法:
topN算法,第一次调用topN,然后把海量数据一次和小顶堆第一个比较,如果>第一个元素,就交换,然后调用minHeapify方法排序一遍。
然后比较下一个数据。


public class HeapSortAndTopN {

    public static void main(String[] args) {
        int[] arr = new int[]{3,5,3,0,8,6,1,5,8,6,2,4,9,4,7,0,1,8,9,7,3,1,2,5,9,7,4,0,2,6};
        new HeapSortAndTopN().sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public void sort(int[] a) {
        int len = a.length;
        int firstNonLeafIndex = (len - 2)/2;

        for(int i = firstNonLeafIndex; i >=0 ; i --) {
            maxHeapify(a,len,i);
        }

        for(int j = len - 1; j > 0 ; j --) {
            swap(a,j,0);
            maxHeapify(a,j,0);
        }
    }

    private void maxHeapify(int[] a, int len, int subTreeNodeMax) {
        int left = subTreeNodeMax * 2 + 1;
        int right = subTreeNodeMax * 2 + 2;
        int maxIndex = subTreeNodeMax;
        if(left < len && a[left] > a[maxIndex]) {
            maxIndex = left;
        }
        if(right < len && a[right] > a[maxIndex]) {
            maxIndex = right;
        }
        if(maxIndex != subTreeNodeMax) {
            swap(a, maxIndex, subTreeNodeMax);
            maxHeapify(a, len, maxIndex);
        }
    }

    private void minHeapify(int[] a, int len, int subTreeNodeMax) {
        int left = subTreeNodeMax * 2 + 1;
        int right = subTreeNodeMax * 2 + 2;
        int maxIndex = subTreeNodeMax;
        if(left < len && a[left] < a[maxIndex]) {
            maxIndex = left;
        }
        if(right < len && a[right] < a[maxIndex]) {
            maxIndex = right;
        }
        if(maxIndex != subTreeNodeMax) {
            swap(a, maxIndex, subTreeNodeMax);
            maxHeapify(a, len, maxIndex);
        }
    }

    private void swap(int[] a, int i, int j) {
        int t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

    public int[] topN(int[] array) {
        if(array != null && array.length > 0) {
            int arrayLen = array.length;
            int firtNonLeafIndex = (arrayLen - 2) / 2;
            for(int i = firtNonLeafIndex; i >= 0 ; i --) {
                minHeapify(array, arrayLen, i);
            }
        }
        return array;
    }

}

相关文章

  • 堆排序和topN算法

    堆排序和topN算法:topN算法,第一次调用topN,然后把海量数据一次和小顶堆第一个比较,如果>第一个元素,就...

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • 数据结构与算法

    常见排序算法 堆排序 算法大全 算法大汇总

  • 堆排序算法思想

    前两天看了看堆排序算法,啃了半天的书,最后搞明白了堆排序算法,今天有时间给大家说说这个堆排序算法。首先讲一下算法的...

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 常用排序算法之堆排序

    堆排序算法 运行 输出

  • 堆排序

    hello,你好,欢迎来到堆排序!堆排序是典型的数据结构和算法的结合,首先使用数据结构记录了必要的信息,然后算法通...

  • 算法与数据结构(六):堆排序

    title: 算法与数据结构(六):堆排序tags: [算法与数据结构, C语言, 堆排序]date: 2019-...

  • 数据结构

    Q:堆排序 A:1 堆排序算法(图解详细流程)2 堆排序 Q:排序算法时间复杂度与稳定性 选择排序为什么不稳定:举...

网友评论

      本文标题:堆排序和topN算法

      本文链接:https://www.haomeiwen.com/subject/ibmpsftx.html