代码

#coding:utf-8
#author:徐卜灵
# 堆排序适用于记录数很多的情况
#与快速排序,归并排序 时间复杂一样都是n*log(n) ####################################################
####################################################
#################################################### # from collections import deque
#
# # 这里需要说明元素的存储必须要从1开始
# # 涉及到左右节点的定位,和堆排序开始调整节点的定位
# # 在下标0处插入0,它不参与排序
# L = deque([49,38,65,97,76,13,27,49])
# L.appendleft(0)
#
# #L = [0,49,38,65,97,76,13,27,49]
#
# def element_exchange(numbers,low,high):
#
# temp = numbers[low]
#
# # j 是low的左孩子节点(cheer!)
# i = low
# j = 2*i
#
# while j<=high:
# # 如果右节点较大,则把j指向右节点
# if j<high and numbers[j]<numbers[j+1]:
# j = j+1
# if temp<numbers[j]:
# # 将numbers[j]调整到双亲节点的位置上
# numbers[i] = numbers[j]
# i = j
# j = 2*i
# else:
# break
# # 被调整节点放入最终位置
# numbers[i] = temp
#
# def top_heap_sort(numbers):
#
# length = len(numbers)-1
#
# # 指定第一个进行调整的元素的下标
# # 它即该无序序列完全二叉树的第一个非叶子节点
# # 它之前的元素均要进行调整
# # cheer up!
# first_exchange_element = length/2
#
# #建立初始堆
# print first_exchange_element
# for x in range(first_exchange_element):
# element_exchange(numbers,first_exchange_element-x,length)
#
# # 将根节点放到最终位置,剩余无序序列继续堆排序
# # length-1 次循环完成堆排序
# for y in range(length-1):
# temp = numbers[1]
# numbers[1] = numbers[length-y]
# numbers[length-y] = temp
# element_exchange(numbers,1,length-y-1)
#
# if __name__=='__main__':
# top_heap_sort(L)
# LL = []
# for x in range(1,len(L)):
# # print L[x],
# LL.append(L[x])
# print LL
##############################################
##############################################
##############################################
def build_maxheap(L,len):
for i in range(len/2,0,-1):
# print i
adjustdown(L,i,len)
return L def adjustdown(L,low,high): #这里只是把一个位于low位置上的数向下移动。
temp = L[low]
i = low
j = 2 * i
while j <= high:
# if j <= high and L[j] < L[j+1]:#z这里的L[j+1]可能不存在,所有会有out of index 报错.
# j+=1
if j <= high and j + 1 <= high:
if L[j] < L[j+1]:
j+=1
if L[j]>temp:
L[i] = L[j]
i = j
j = 2 * i
else:
break
L[i] = temp
# return L #由于这里是中间列表,不要输出。
# print L
# L = [0,49,38,65,97,76,13,67,47]
# L = build_maxheap(L,8)
# del L[0]
# # print type(L)
# print "大根堆第一次:",L len = len(L)-1
def Heap_sort(L,len):
build_maxheap(L,len)
for i in range(len,1,-1):
L[i],L[1] = L[1],L[i]
# print i
# print L[len],L[1]
adjustdown(L,1,i-1)
return L
L = [49,38,65,97,76,13,67,47]
print "原列表:" ,L
L.insert(0,0)
L = Heap_sort(L,len)
del L[0]
print "堆排序:",L #基本思路是:
# 1先从后到前进行小数下移的操作。这个后是指len(L)/2
#2.第一步完成后,最大的那个数就上移到了根节点。把这个根节点与最后一个元素交换位置,这时最后一个元素就在有序区里。则只需要将第一个元素再进行下移操作即可。
#3.循环第二步,直到只剩下根节点。

堆排序真的是排序算法中我花费时间最多的算法了,最开始是理解原理上出了问题。理解了之后写代码又出了问题。

对于二叉树不是很熟的最好复习一下树的知识。

理解了之后就能很好的写代码了。

思路:

1.从len(L)/2 到1开始,建立大根堆。这里需要注意的是:这里的元素并不是一次就能移动到最终的位置的。只有迭代到第一个元素,才能建立一个大根堆。

2.将堆顶元素与无序区最后一个元素交换位置,破坏了大根堆,则重新建立大根堆。

3.迭代第二步,直到只剩下一个元素。

时间复杂度:O(nlogn)

空间复杂读:O(nlogn)

跟快排是一样的。

堆排序也是不稳定的排序方法,这一定要搞清楚。

八大排序算法的python实现(五)堆排序的更多相关文章

  1. 八大排序算法的 Python 实现

    转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...

  2. python基础===八大排序算法的 Python 实现

    本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...

  3. 八大排序算法---基于python

    本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...

  4. 八大排序算法的python实现(六)归并排序

    代码: #coding:utf-8 #author:徐卜灵 def merge(left,right): i,j = 0,0 result = [] while i < len(left) an ...

  5. 八大排序算法(Python)

    一.插入排序 介绍 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据.      算法适用于少量数据的排序,时间复杂度为O(n^2).      插入 ...

  6. [Swift]八大排序算法(四):堆排序

    排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...

  7. 八大排序算法的python实现(三)冒泡排序

    代码: #coding:utf-8 #author:徐卜灵 #交换排序.冒泡排序 L = [1, 3, 2, 32, 5, 4] def Bubble_sort(L): for i in range( ...

  8. 八大排序算法的python实现(一)直接插入排序

    刚参考网上的以及书上的资料把这八大算法又复习了一遍,感悟就是:有些算法原理真的很简单,一看就懂,但实现起来总是有这样那样的问题. 闲言少叙,先贴代码,之后再以自己的理解,以及自己在理解与实现的过程中遇 ...

  9. 写代码?程序猿?你不能不懂的八大排序算法的Python实现

    信息获取后通常需要进行处理,处理后的信息其目的是便于人们的应用.信息处理方法有多种,通常由数据的排序,查找,插入,删除等操作.本章介绍几种简单的数据排序算法和高效的排序算法. 本章主要涉及到的知识点有 ...

随机推荐

  1. day5心得

    import 模块 1.定义: 模块:用来从逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能),本质就是.py结尾的python文件(文件名test.py 模块名:test) 2导入方法 ...

  2. blockground

    颜色的表示方法 一共有三种:单词.rgb表示法.十六进制表示法 rgb:红色 绿色 蓝色 三原色光学显示器,每个像素都是由三原色的发光原件组成的,靠明亮度不同调成不同的颜色的.用逗号隔开,r.g.b的 ...

  3. Sprint + mybatis 编写测试

    今天使用Spring 和mybatis框架编写项目,写了个测试方法方便测试,之前因为一直报空指针,注入不了,所以简单记录一下,方便以后使用 root.xml <?xml version=&quo ...

  4. tmux颜色高亮跟vim不一致的情况

    安装完tmux之后,按照网上大神的配置,稍微配置了下~/.tmux.conf: # 改变快捷键前缀 unbind C-b set -g prefix C-a # 绑定配置加载按键 bind r sou ...

  5. 13-STL-二分查找

    STL中提供-二分查找算法(binary_search lower_bound upper_bound equal_range   STL包含四种不同的二分查找算法,binary_search    ...

  6. dubbo 相关面试题 有用

    调用关系说明: · 0. 服务容器负责启动,加载,运行服务提供者. · 1. 服务提供者在启动时,向注册中心注册自己提供的服务. · 2. 服务消费者在启动时,向注册中心订阅自己所需的服务. · 3. ...

  7. Unix基本系统数据类型和stat结构体

    Unix基本系统数据类型 历史上,某些UNIX变量已与某些C数据类型联系在一起,例如,历史上主.次设备号存放在一个1 6位的短整型中, 8位表示主设备号,另外8位表示次设备号.但是,很多较大的系统需要 ...

  8. glib hash库GHashTable的使用实例

    前言 hash表是一种key-value访问的数据结构,hash表存储的数据能够很快捷和方便的去查询.在很多工程项目都需要使用到hash表来存储数据.对于hash表的详细说明这里就不进行阐述了,不了解 ...

  9. U14.04 teamviewer install

    转载http://www.cnblogs.com/kunyuanjushi/p/5205639.html 安装i386库 sudo apt-get install libc6:i386 libgcc1 ...

  10. win7,64bit下的OpenGL着色语言(glsl)开发环境配置(原)

    一.环境准备: 系统环境win7,64位,双显卡:集成显卡+gt540m,gt540建议下载最新的驱动,可以支持到opengl4.3标准,一般双显的笔记本,程序默认启用的是集显,我机器的集显驱动有点老 ...