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

堆排序算法

阅读更多

     所谓堆,是满足如下条件的一个序列:n个元素,任意第i个元素具备同时不比2i和2i+1个元素小或者大。把堆看成一个完全二叉树,那么这棵树所有左右子节点都要具备同时不比父节点小或者大。

    从堆得定义可以看出序列的第一个元素,也就是堆顶元素一定是整个序列里最大或者最小的元素。堆排序就是利用了堆的这一特性来实现的。

    堆排序可以简单文字描述如下:1.把一个无序序列调整成一个堆;2.输出堆顶元素,然后把剩下的序列调整成堆。3.如果堆还有元素,继续做操作2。

    怎么把一个无序序列调整成一个堆呢?父节点和子节点根据条件不停调整可以得到一个堆,这个过程称之为筛选。把这个序列看成一个完全二叉树,最后一个非叶子节点是第n/2求整个元素,筛选只需要从这一个元素开始递减一直到第一个元素即可。

    接着说说取走堆顶元素后,怎么调整这个堆:从堆顶拿走一个最大或者最小值后,把堆得最后一个元素放到堆顶,这时堆顶的两个子节点仍然是堆,这时我们沿着堆顶开始向下筛选,很快就能得到一个新堆了。

    堆排序java实现代码:

public class HeapSort extends BaseSort
{

    @Override
    protected void sortAlg(int[] ls)
    {
        buildHeap(ls, ls.length - 1);
        hsort(ls, ls.length - 1);
    }

    private void hsort(int[] ls, int end)
    {
        swap(ls, 0, end);
        for(int i = end-1; i > 0; i--)
        {
            maxHeapifyk(ls, 0, i);
            swap(ls, 0, i);
        }
    }

    private void buildHeap(int[] ls, int end)
    {
        for(int i = ((end - 1) >> 1); i >= 0; i--)
        {
            maxHeapifyk(ls, i, end);
        }
    }

    /**
     * Ki>=K2i Ki>=K2i+1
     * 
     * @param ls
     * @param i
     */
    private void maxHeapifyk(int a[], int i, int end)
    {

        int maxIndex = i;
        int finish = (end - 1) >> 1;
        for(int j = i; j <= finish;)
        {
            int left = (j << 1) + 1;
            int right = left + 1;
            if(left <= end && a[left] > a[j])
                maxIndex = left;
            if(right <= end && a[right] > a[maxIndex])
                maxIndex = right;
            if(maxIndex != j)
            {
                swap(a, maxIndex, j);
                j = maxIndex;
            }
            else
            {
                break;
            }
        }
    }

    堆排序的时间复杂度稳定在O(nlogn)

 

 

0
0
分享到:
评论

相关推荐

    堆排序算法实例

    堆排序算法利用了这个特性来有效地对数据进行排序。 首先,我们从标题"堆排序算法实例"中了解到这个话题主要关于堆排序的实际应用。在编程环境中,如VC6.0(Visual C++ 6.0),开发者可以编写代码来实现堆排序算法...

    堆排序算法(流程图、关键代码、复杂度分析)

    堆排序算法(流程图、关键代码、复杂度分析) 堆排序算法是一种基于比较的排序算法,通过将输入数据分成一个小顶堆来实现排序。下面我们将详细介绍堆排序算法的流程图、关键代码和复杂度分析。 一、流程图 堆排序...

    堆排序算法 C语言实现

    C语言实现的堆排序算法。 提供了堆排序算法的一个接口,可以为其它功能提供功能。

    堆排序算法简单实现

    3. **完整过程**:堆排序算法通常包含两个阶段,构建堆和交换下沉。首先,通过从最后一个非叶子节点开始,自上而下地调整整个序列,使其成为一个合法的堆。然后,在这个过程中不断交换堆顶元素和末尾元素,每次交换...

    堆排序算法 java

    堆排序算法 java

    堆排序算法分析及源代码

    通过阅读和分析这段源代码,你可以更深入地了解堆排序算法,并可能学习到如何在实际编程项目中应用这种排序方法。 总的来说,堆排序是一种重要的排序算法,它利用了二叉堆的特性实现了高效的排序。通过建堆、调整和...

    堆排序算法(java)

    java的堆排序算法实现程序,含测试,可直接运行。java的堆排序算法实现程序,含测试,可直接运行。

    面试题 写一个堆排序算法 c++

    一个堆排序算法 c++写的 逻辑相同 可自行 改为java 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一...

    应用Java和Python分别实现堆排序算法

    堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和...

    最小堆排序算法实现

    算法设计课程中的最小堆排序算法实现,windows下实现。

    C语言数据结构堆排序算法

    使用C语言编写的数据结构程序,为堆排序算法的实现。可作为课程设计题目来做。

    c语言实现堆排序算法

    ### c语言实现堆排序算法 堆排序是一种基于比较的排序算法,它利用了二叉堆的数据结构特性来高效地对数据进行排序。堆排序可以分为最大堆和最小堆两种,其中最大堆指的是父节点的值总是大于或等于任意一个子节点的...

    堆排序算法源代码

    在这个名为"sort"的压缩包中,很可能包含了实现堆排序算法的C/C++源文件。 堆排序的核心思想是利用树形数据结构——堆(Heap)来完成排序。堆是一个近似完全二叉树的结构,同时满足大顶堆(父节点的值大于或等于其...

    堆排序算法实现

    首先,我们从标题"堆排序算法实现"开始,这表明我们将讨论如何用编程语言来实现这个算法。在这个例子中,使用的编程语言是C语言,这是一种广泛应用于系统编程、嵌入式系统以及各种应用程序开发的高级语言。 描述中...

    排序算法之堆排序算法:用C++语言实现堆排序算法

    标题"排序算法之堆排序算法:用C++语言实现堆排序算法",意味着我们将讨论如何用C++编程语言来实现堆排序的过程。C++是面向对象的编程语言,具有丰富的库支持和高效的执行性能,是实现算法的理想选择。 描述"排序...

    内部堆排序算法的实现课程设计说明书.doc

    内部堆排序算法的实现课程设计说明书.doc

    堆排序算法详细配图讲解

    堆排序算法在实际应用中通常用数组来实现堆的结构,因为数组能够有效地表示完全二叉树的层级特性。 堆排序算法的步骤大致如下: 1. 构建初始堆:给定一个无序的数组序列,根据堆的性质,将其调整为一个大根堆或小根...

    C++堆排序实现算法

    简单的堆排序算法:以定长数组为例,动态数组等可以以此类推

    最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法

    最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法

    算法设计实验报告堆排序代码

    【堆排序算法详解】 堆排序是一种高效的比较排序算法,其主要思想是利用堆这种数据结构进行数据的排序。堆是一个近似完全二叉树的结构,同时满足堆的性质:即父节点的键值总是大于或等于(在最大堆中)或小于或等于...

Global site tag (gtag.js) - Google Analytics