`
crabdave
  • 浏览: 1294846 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

小顶堆排序Java代码样例

    博客分类:
  • Java
 
阅读更多

小顶堆排序Java代码样例

 

import java.util.Arrays;

public class MinHeapTopN {

    //    top num
    private int topN;
    //    top n number array
    private int[] topNHeap;

    /**
     * init
     *
     * @param topN
     * @param unSortedArray
     */
    public MinHeapTopN(int topN, int[] unSortedArray) {
        this.topN = topN;
        this.topNHeap = new int[topN];

//        init topN array
        for (int i = 0; i < topN; i++) {
            this.topNHeap[i] = unSortedArray[i];
        }

//        create min heap
        createMinHeap();

//        add new num
        for (int i = topN; i < unSortedArray.length; i++) {
            putNewNum(unSortedArray[i]);
        }
    }

    /**
     * put a new number to the min heap
     *
     * @param newNum
     */
    private void putNewNum(int newNum) {
//        only great than root node need to sort
        if (newNum > this.topNHeap[0]) {
            this.topNHeap[0] = newNum;
//                adjust heap
            UpToDown(0);
        }
    }

    /**
     * create a min heap
     */
    private void createMinHeap() {
//        the first no leaf node from the tail
        int pos = this.topN / 2;
        for (int i = pos; i >= 0; i--)
            UpToDown(i);
    }

    /**
     * adjust the heap
     *
     * @param i
     */
    private void UpToDown(int i) {
        int leftChildIndex, rightChildIndex, tmp, pos;
//       the left child index
        leftChildIndex = 2 * i + 1;
//        the right child index
        rightChildIndex = leftChildIndex + 1;

        if (leftChildIndex > (this.topN - 1)) {
//            no child
            return;
        } else {
            if (rightChildIndex > (this.topN - 1))
//                only have left child
                pos = leftChildIndex;
            else
//                get the index of great one
                pos = this.topNHeap[leftChildIndex] > this.topNHeap[rightChildIndex] ? rightChildIndex : leftChildIndex;

            if (this.topNHeap[i] > this.topNHeap[pos]) {
//                swap
                tmp = this.topNHeap[i];
                this.topNHeap[i] = this.topNHeap[pos];
                this.topNHeap[pos] = tmp;
//                continue adjust
                UpToDown(pos);
            }
        }
    }

    public static void main(String[] args) {
        int[] all = {16, 7, 3, 20, 17, 5698, 13, 120, 117, 318, 5213, 2120, 2117, 218};
        MinHeapTopN mntn = new MinHeapTopN(3, all);

        System.out.print(Arrays.toString(mntn.topNHeap));
    }
}

 

分享到:
评论

相关推荐

    堆排序--大顶堆排序

    堆排序--大顶堆排序 大顶堆排序是堆排序的一种,通过构建大顶堆来实现排序的过程。下面是对大顶堆排序的详细解释: 什么是大顶堆? 大顶堆是一种特殊的完全二叉树,它满足以下条件: * 对于每个非叶子节点,节点...

    各种排序Java代码

    以下将详细讲解标题“各种排序Java代码”中涉及的几种排序方法,包括快速排序、冒泡排序、堆排序和归并排序。 1. **快速排序(Quick Sort)**: 快速排序是一种基于分治思想的高效排序算法,由C.A.R. Hoare在1960...

    Java各种排序算法代码.

    7. **堆排序**:基于完全二叉树的堆数据结构,通过构建大顶堆或小顶堆进行排序。堆排序在原地进行,无需额外空间,但效率低于快速排序。 8. **计数排序**:非基于比较的排序,适用于整数排序,统计每个元素出现的...

    各种排序的java代码归总

    以下是对标题“各种排序的java代码归总”及描述中提到的排序算法的详细解析: 1. **冒泡排序(Bubble Sort)**: 冒泡排序是一种简单的排序算法,通过不断交换相邻的逆序元素来逐步排序。其主要步骤包括比较和交换...

    Java各种排序算法代码.zip

    堆排序利用了完全二叉树的特性,将待排序的序列构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,调整堆,继续此过程,直到所有元素排序完毕。Java的PriorityQueue类可以用来实现堆排序的一部分功能。 7. ...

    Java各种排序算法代码

    堆排序利用了二叉堆的数据结构,将待排序序列构造成一个大顶堆或小顶堆,然后交换堆顶元素与末尾元素,缩小排序范围,重复此过程直到排序完成。其时间复杂度为O(n log n)。 7. 计数排序(Counting Sort) 计数排序...

    C++实现优化冒泡排序、首/尾点快速排序、大顶堆排序

    C++实现优化冒泡排序、首/尾点快速排序、大顶堆排序,包含main函数,快速排序中需要手动输入排序元素数量和元素

    最新最全的排序方法 Java 源代码

    在Java中,Shear Sort通常用于处理较小规模的数据,其特点是代码简洁,但效率略逊于其他高级排序算法。 2. **SortApp**:这是一个通用的排序应用类,可能包含了对不同排序算法的封装或者提供了一种通用的排序接口,...

    策略模式实现五种排序java代码

    它首先构造一个大顶堆(或小顶堆),然后将堆顶元素与末尾元素交换,再调整剩余元素为新的堆,重复这个过程直到所有元素排序完毕。 5. **实现细节**:在Java中,你可以创建一个`SortingStrategy`接口,包含一个`...

    堆排序算法源代码

    堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在本场景中,我们关注的是堆排序的源代码,它适用于openSUSE 11.4操作系统,并且是使用GCC version 4.5.1编译器编译的。在这个名为"sort...

    堆排序JAVA实现代码

    堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在Java中,我们可以利用数组来表示堆,因为数组天然具有树形结构的特性。以下将详细介绍堆排序的原理、步骤以及Java实现。 **堆排序的...

    八大排序算法总结(含Java实现源代码)

    首先构建一个大顶堆(或小顶堆),然后将堆顶元素与最后一个元素交换,接着调整剩余元素为新的堆,再将堆顶元素与最后一个元素交换,直到整个数组有序。Java实现中,可以使用PriorityQueue(优先队列)来辅助实现堆...

    简单选择排序及堆排序源代码

    - 构建初始堆:将待排序序列构造成一个大顶堆或小顶堆。 - 调整堆:将堆顶元素与末尾元素交换,然后将剩余元素重新调整为堆。 - 递归过程:将堆的大小减一,重复步骤2,直到堆的大小为1,排序完成。 3. **优点**...

    十种排序的Java代码实现

    本资源提供了十种不同的排序算法的Java代码实现,这有助于开发者深入理解各种算法的工作原理,并在实际项目中根据需求选择合适的排序方式。 1. 冒泡排序(Bubble Sort):冒泡排序是一种简单的排序算法,通过重复...

    几种常见排序算法代码

    堆排序利用了堆这种数据结构,将待排序的元素构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,再调整堆。时间复杂度为O(n log n),空间复杂度为O(1)。 八、拓扑排序 拓扑排序主要用于有向无环图(DAG)的...

    程序员必须知道的8大排序Java版源代码

    本资源提供了八种经典的排序算法的Java源代码实现,包括直接插入排序、希尔排序、简单选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序。下面将对这八大排序算法进行详细介绍。 1. **直接插入排序...

    Java排序算法(桶排序,基数排序等)

    堆排序利用堆这种数据结构实现排序,首先构建一个大顶堆或小顶堆,然后将堆顶元素与最后一个元素交换,再调整堆,重复这个过程直到排序完成。时间复杂度始终为O(n log n)。Java实现如下(未给出,需自行实现)。 8....

Global site tag (gtag.js) - Google Analytics