排序算法之---堆排序(很重要的一个结构,新手入门必备)

标签: 排序算法入门
17人阅读 评论(0) 收藏 举报
分类:

排序算法之---堆排序(很重要的一个结构,新手入门必备)


先来简单的介绍一下堆结构:

堆排序是利用这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它是不稳定排序。首先简单了解下堆结构。


 堆是具有以下性质的完全二叉树:

每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;

每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

如下图:


大根堆和小根堆在数组中的特点如下:

大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]  (i是指父节点,2i+1是子节点)

小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]  


下面就来介绍一下堆排序的基本思想和步骤:

堆排序的基本思想是:将待排序的序列构造成一个大顶堆(1),此时,整个序列最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆(2),这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了(3)

(1)将待排序的序列构造成一个大根堆:

将数组一个一个插入大根堆中:当插入的元素比起父节点大的时候,与父节点交换,并且将父节点的索引赋值给子节点,不断地 往上递归上去比较。

举个粟子:


当插入9的时候,比较完发现9还比交换后的父节点大,那就还要继续交换了。


(2)构成大根堆之后,此时整个序列最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆。

54~58这几行表示的是:这个时候就要将较大的子节点与父节点进行比较了,如果子节点更大的话,那就交换父节点和子节点

59~60行这里则表示,当子节点比其父节点还大的时候,交换它们两个的位置,同时,将index指针往下传,继续判断是否有比父节点还大的子节点。


参考:https://www.cnblogs.com/chengxiao/p/6129630.html,这篇博文写的很清晰,只是不同的是,大根堆的形成不是很相同。可以参考,很详细。

查看评论

排序算法(归并排序, 快速排序, 堆排序)

算法思想:       归并排序:       利用分治法,   每次将数组一分为二,  生成子数组,  分别对子数组排序,   在对排好序的子数组进行合并,  直到生成 有序的完整数组为止.   ...
  • u010506130
  • u010506130
  • 2016-08-10 08:47:47
  • 602

iOS开发算法--堆排序

堆排序 详细代码请参考Algorithm。参考代码比文字好理解。 堆排序是时间复杂度为O(N*logN)的排序方法。是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可...
  • MinggeQingchun
  • MinggeQingchun
  • 2017-05-23 15:17:18
  • 557

排序算法 快速排序 归并排序 堆排序

一:插入排序思想:在对整个数组循环for(i = 0;i < n;i++)的过程中,保证此时走到的i位置的前面已经是一个有序序列,所以对于i位置的处理就是由i位置依次向前,找到第一个不满足大于此时i位...
  • yangbodong22011
  • yangbodong22011
  • 2015-12-14 18:45:21
  • 971

九大排序算法的手写实现及时空复杂度分析 笔试面试必备

1、冒泡排序 冒泡排序是一种简单的排序方法,算法如下: 1. 首先将所有待排序的数字放入工作列表中。 2. 从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与...
  • jichangzhen
  • jichangzhen
  • 2016-08-19 11:08:55
  • 2468

排序算法(七)——堆排序

基本思想 堆排序是一种树形选择排序,是对直接选择排序的改进。   首先,我们来看看什么是堆(heap): (1)堆中某个节点的值总是不大于或不小于其父节点的值; (2)堆总是一棵完全二叉树(Compl...
  • u012152619
  • u012152619
  • 2015-08-13 08:39:32
  • 15417

数据结构堆的插入与删除 堆排序

  • 2015年05月09日 09:52
  • 37KB
  • 下载

ios oc实现排序算法

oc实现的快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序 /*******************************快速排序 start******...
  • u012367335
  • u012367335
  • 2016-06-29 10:53:47
  • 718

【算法之常用排序算法(一)】八大常用内部排序算法(快排、冒泡、希尔、堆排序等)

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大排序就是内部排序。 ...
  • cangchen
  • cangchen
  • 2015-04-01 23:09:32
  • 3631

需要手写的算法之-----堆排序算法

void HeapCore(vector &vec ,size_t size, size_t end){ size_t i = end ; size_t j = i ; bool flag =...
  • iihtd
  • iihtd
  • 2016-04-28 11:48:45
  • 460
    个人资料
    持之以恒
    等级:
    访问量: 686
    积分: 411
    排名: 12万+
    文章存档
    最新评论