`
SCYForce
  • 浏览: 40817 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

算法笔记(第一部分)-- 排序之白话堆排序

阅读更多
堆排序是一种基于比较的排序算法,它比实现的较好的快速排序慢一些,但是它的平均时间复杂度为O(nlogn),空间复杂度为О(n),它是一种in-place的算法,但是却是不稳定的排序算法。

最大堆与最小堆的定义:
根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为最小堆.

根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者的堆称为最大堆.

P.S:

堆中任一子树亦是堆。本文讨论的堆实际上是二叉堆(Binary Heap),类似地可定义k叉堆。

堆排序的过程:
1. 根据输入的数据集建立一个最大堆(最小堆)
2. 进行堆排序,将Root(最大值)与堆的最后一个元素交换
3. 堆调整,继续维护成为最大堆
4. 进行步骤2和3,直至排序完成

堆排序动画:


堆排序代码-siftDown:
public void siftDown(int[] data,int start, int end) {
          int root = start;
          while((2*root + 1)<=end){
                int child = root*2+1;
                if (child < end && data[child]<data[child+1]){
                      child++;
                }
                if (data[root]<data[child]){
                      swap(data,root,child);
                      root = child;
                }else
                      break;
          }
    }

这段代码是堆排序的核心,对堆中的元素进行调整。简单来说做的工作就是,针对一个堆点,将其与它孩子中较大的那个进行比较,若大不变,若小与该孩子交换位置,若交换后该堆点(处于原先它孩子的位置)仍有孩子则继续与孩子中较大的那个进行比较,若大不变,若小与该孩子交换位置,调整直至该堆点没有孩子结束。

heapify:
public void heapify(int[] data, int count){
          int start = (count-1)/2;
          while(start>=0){
                siftDown(data,start,count-1);
                start = start-1;
          }
    }

这段代码是建堆的过程,找到最后一个有孩子的堆点,对该堆点进行调整,直至调整到Root。

heapsort:
public void heapsort(int[] data, int count){
           heapify(data, count);
           int end = count - 1;
           while (end>0){
               swap(data, 0, end);
               siftDown(data, 0, --end);
           }
    }

这段代码解释了堆排序的过程,首先建堆,然后将Root与堆底元素交换,继而调整现有堆中Root(交换后的Root)的位置,不断的调整直至遍历完整个堆。

堆排序讲的比较乱,如有不能理解或我讲错的地方,希望大家能够指出。
1
0
分享到:
评论
1 楼 lenky0401 2008-09-07  
马马虎虎的看完了
给LZ推荐两个网页

http://www.cs.rit.edu/~atk/Java/Sorting/sorting.html
http://www.cs.ubc.ca/~harrison/Java/sorting-demo.html

相关推荐

    MoreWindows白话经典算法之七大排序

    冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序和堆排序是七大基础的计算机算法,它们各自有着不同的特点和适用场景。 一、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地遍历要...

    MoreWindows白话经典算法之七大排序第2版(高清)

    本书《更多Windows白话经典算法之七大排序第2版》是一部深入浅出讲解七种经典排序算法的著作,旨在帮助读者理解并掌握冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序以及堆排序等基本概念和...

    MoreWindows白话经典算法之七大排序(高清版)

    ### 白话经典算法之七大排序 #### 一、冒泡排序 冒泡排序是一种简单直观的排序算法,它的基本思想是从第一个元素开始,比较相邻元素的大小,如果前一个元素大于后一个元素则交换它们的位置,这样一轮比较下来,...

    白话经典算法之七大排序

    堆排序是一种树形选择排序,是在排序过程中,把数组看成是一个完全二叉树的结构,并对当前无序的数组部分,驱动选择排序,找到最大的值放到数组末尾,然后缩小数组的范围继续这个过程,直到所有元素均排序完成。...

    白话经典算法之七大排序(高清版)

    《白话经典算法之七大排序》是一本专为初学者设计的算法教程,旨在通过简单易懂的语言,帮助读者深入浅出地理解并掌握七大排序算法。这些排序算法是计算机科学与信息技术领域的基础,对于提升编程能力和解决实际问题...

    白话经典算法系列之六 快速排序 快速搞定 - MoreWindows - 博客园1

    快速排序是一种高效的排序算法,由C.R.A.Hoare在1962年提出。它基于分治策略,但其完整流程可以更准确地描述为“挖坑填数+分治法”。快速排序的核心思想是通过选取一个基准数,将数组分为两部分:一部分的所有元素都...

    经典算法之七大排序白话讲解第二版

    以上就是对直接选择排序、希尔排序、归并排序、快速排序以及堆排序这五大经典排序算法的介绍。每种排序算法都有其特点和应用场景,了解它们的工作原理可以帮助我们在实际编程中做出更加合理的选择。接下来的文章中将...

    [网盘]MoreWindows白话经典算法之七大排序第2版(高清)

    在第一版的基础上新加了对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法的总结篇,方便大家复习,合适作为笔试面试前的复习资料。

    白话经典算法

    本文将详细解析七种经典的排序算法:冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序以及堆排序。这些算法对于程序员来说至关重要,无论是在日常开发还是在面试中,都是常被问及的知识点。 1....

    白话算法(理论联系实际)-初探遗传算法接近完美

    1. **种群**:遗传算法的起点是一个包含多个解(个体)的集合,每个个体都有一个与之相关的适应度值,这通常反映了该解的质量或性能。 2. **基因编码**:个体的基因编码是问题解决方案的表示方式,可以是二进制串、...

    排序算法经典讲解

    本资源"MoreWindows白话经典算法之七大排序(高清版).pdf"提供了一套详尽的排序算法讲解,涵盖了七大经典的排序算法。以下是这些排序算法的详细介绍: 1. 冒泡排序(Bubble Sort): 冒泡排序是一种简单的交换排序,...

    白话的排序总结

    堆排序利用堆这种数据结构设计的一种排序算法,堆通常被视为一种近似完整的二叉树,或者是一个数组对象。 **基本步骤**: 1. 建立一个最大堆。 2. 把堆顶的元素与堆尾的元素交换,然后将剩余的元素重新调整为最大堆...

    More Windows白话经典数据结构算法之七大排序最新整理版

    冒泡排序是最基础也是最容易理解的排序算法之一。它的基本思路是通过不断地比较相邻两个元素,并根据比较结果进行交换来实现排序。整个过程如同气泡逐渐上升一样,较大的元素会逐步地移动到序列的末尾。 **冒泡排序...

    最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(CC++)

    最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(CC++),希望对你能有所帮助!

    基于python 3 编程实现常用的排序算法,包括:冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序、堆排序

    基于python 3 编程实现常用的排序算法,包括:冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序、堆排序.zip 基于python 3 编程实现常用的排序算法,包括:冒泡排序、直接插入排序、直接选择...

    遗传算法的matlab程序--数学建模

    遗传算法的matlab程序,希望对学习遗传算法的人或对之感兴趣的人有所帮助!

Global site tag (gtag.js) - Google Analytics