堆排序:heap sort属于选择排序
堆的定义:有n个元素的序列(k1,k2...kn)满足:
1:Ki =< K2i 且 Ki =< K2i+1 (小顶堆)
或
2:Ki >= K2i 且 Ki >= K2i+1 (大顶堆)
i = (1,2,...n/2)
基本思想:
把要排序的n个数的序列组建成一个堆,将堆顶元素输出(这时,堆顶元素也即是根元素是最大或最小),然后对剩余的n-1个元素再次组建成堆,再次输出堆顶元素……
直到只有两个结点的堆,对它们进行交换,得到一个n个结点有序数列
操作:需要解决两个问题:
1:怎么建成堆
2:输出堆顶元素后,怎么对余下的n-1个元素,构成新的堆
先看第二个问题的解决:
1)将堆底元素送入堆顶(最后一个元素与堆顶交换),堆被破坏
2)将根结点与左,右子树中的最小(或最大)元素进行交换
3)若与左子树交换,若左子树的根结点不满足堆定义,重复2)
4)若与右子树交换,若右子树的根结点不满足堆定义,重复2)
5)继续对不满足堆定义的结点进行调整,直到叶子节点,堆建成
再看第一个问题,堆的建成
1)n个结点的完全二叉树,最后一个节点是第n/2个结点的子树
2)筛选从第n/2个结点为根的子树开始,将该子树建成堆
3)继续对n/2-1的结点,重复2)直到n/2-1=1
算法复杂度:
最坏情况下接近最差情况:O(n*logn)
稳定性:
不稳定
python代码:heap_sort.py
#coding:utf-8
def build_heap(l, length):
for i in range((length-1)/2, -1, -1):
adjust_heap(l, i, length)
#l是待排序数列
#s是待调整的数组元素的位置
#length是数组长度
#这是小顶堆排序
def adjust_heap(l, s, length):
tmp = l[s]
child = 2*s + 1 #左孩子结点的位置
while(child < length):
if(child+1 < length and l[child] < l[child+1]):
child += 1 #查找左右结点中最小的元素
if l[s] < l[child]:
l[s] = l[child]
s = child #重新设置s,即待调整的下一个结点的位置
child = 2*s + 1
else:
break
l[s] = tmp
def heap_sort(l, length):
#初始化堆
build_heap(l, length)
#从最后一个元素开始对序列进行调整
for i in range(length - 1, -1, -1):
tmp = l[i] #堆顶元素和堆底元素交换
l[i] = l[0]
l[0] = tmp
adjust_heap(l, 0, i) #注意此时堆的大小i
if __name__ == '__main__':
l = [3,1,5,7,2,4,9,6,10,8]
heap_sort(l, 10)
print('result:' + str(l))
分享到:
相关推荐
堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法...
常用的排序算法--堆排序,通过创建堆的方法进行排序
排序算法:排序算法汇总--各类排序算法 冒泡,选择,插入,快排,归并,堆排
选择排序算法也是一种简单的排序算法,它的工作原理是通过选择最小或最大元素,并将其与第一个元素交换,以达到排序的目的。选择排序算法的时间复杂度也为O(n^2),因此它也适合小规模的数据排序。 3.插入排序算法 ...
各类排序算法整理--C语言描述--本人编写 排序算法种类有: 冒泡 快速排序 堆排序 希尔排序 插入排序 选择排序 二路归并排序
本文将对快速排序、归并排序、堆排序等常见排序算法进行比较和分析,探讨它们的优缺点和适用场景。 首先, let's 看一下这些排序算法的时间复杂度和空间复杂度: | 排序算法 | 平均情况 | 最好情况 | 最坏情况 | ...
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
堆排序的源程序--编译、运行成功的。 其基本算法思想参照《算法导论》。 有点编译器需去掉-system("pause");
本文将深入探讨标题和描述中提到的一些基本排序算法,包括选择排序、冒泡排序、插入排序、希尔排序、堆排序、快速排序以及归并排序,并结合C++编程语言进行讲解。 1. **选择排序(Selection Sort)** - 选择排序是一...
在实际应用中,通常会选择时间复杂度更低的排序算法,如快速排序、归并排序或堆排序,它们在大多数情况下能提供更好的性能。然而,理解这些基础排序算法有助于我们更好地掌握排序的本质,以及如何根据具体需求选择...
经典排序算法 - 堆排序Heap sort序 经典排序算法 - 地精排序Gnome Sort 经典排序算法 - 奇偶排序Odd-even sort 经典排序算法 - 梳排序Comb sort 经典排序算法 - 耐心排序Patience Sorting 经典排序算法 - 珠...
此文件为数据结构中的九种排序算法,包含一些排序方法的过程,其九种排序包括:直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,基数排序!
在计算机科学领域,排序算法是数据结构中至关重要的一部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序(如升序或降序)排列。本资料“排序算法图解”将深入探讨这一主题,通过可视化的方式帮助我们...
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
七大排序算法如下: 交换排序:快速排序quicksort,冒泡排序bubblesort...选择排序:直接选择排序selectionsort,堆排序maxheapsort 插入排序:直接插入排序insertsort,希尔排序shellsort 合并排序:归并排序mergesort
本主题将深入探讨四种常见的排序算法:堆排序、快速排序以及两种未在标题中明确提到但同样重要的排序方法——基数排序和计数排序。 首先,让我们详细了解一下堆排序。堆排序是一种基于比较的排序算法,利用了数据...
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
堆排序是一种基于比较的排序算法,它通过构建一个大顶堆或小顶堆来实现排序。在计算机科学中,堆通常被理解为一种特殊的树形数据结构,满足堆的性质:父节点的值总是大于或等于(对于大顶堆)或小于或等于(对于小...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...