【数据结构&&算法系列】堆排序简单介绍及其实现
来源:互联网 发布:2017年人口老龄化数据 编辑:程序博客网 时间:2024/05/21 08:47
堆数据结构是二叉树的数据结构。
堆排序主要为建堆,然后就是依次取出最大或者最小值,取出后并调整堆。
与插入排序相同,堆排序具有空间原址性。
如果从小到大排序,建立的是最大堆,把最大的元素(堆顶元素)取出,与数组末端数据进行替换,依次取出,直到所有数据都排好序。
堆排序的时间复杂度是o(n*logn)。
下面是堆排序的python实现,其中数组下标从0开始,因此父亲、左孩子、右孩子节点的坐标的计算方式有所不同,可以自己推导下。
#coding:utf-8# 父节点坐标def parent(i):return (i-1)>>1# 左孩子节点坐标def left(i):return 2*i + 1 # 如果用位运算的话,注意是 (i<<1) + 1 而不是 i<<1+1 (相当于4*i) , 因为位运算优先级小于加减运算优先级# 右孩子节点坐标def right(i):return 2*i + 2# 调整为最大堆def max_heapify(arr,heap_size,i):l = left(i)r = right(i)largest = iif l<heap_size and arr[l]>arr[i]:largest = lif r<heap_size and arr[r]>arr[largest]:largest = rif largest != i:# 交换 arr[i] 和 arr[largest] 注:可以直接使用 arr[i],arr[largest] = arr[largest],arr[i]arr[i] = arr[i]^arr[largest]arr[largest] = arr[i]^arr[largest]arr[i] = arr[i]^arr[largest]max_heapify(arr,heap_size,largest)def build_max_heap(arr):heap_size = len(arr)for i in range(parent(heap_size-1), -1, -1):max_heapify(arr, heap_size, i)def heap_sort(arr):# 构建最大堆build_max_heap(arr)# 堆排序for i in range(len(arr)-1, 0, -1):# 交换 arr[0] arr[i] 注:可以直接使用 arr[i],arr[0] = arr[0],arr[i]arr[0] = arr[0]^arr[i]arr[i] = arr[0]^arr[i]arr[0] = arr[0]^arr[i]max_heapify(arr,i,0)def show_arr(arr): print "[", ", ".join([str(x) for x in arr]), "]" if __name__ == "__main__":arr = [4,1,3,2,16,9,10,14,8,7]heap_sort(arr)show_arr(arr)
0 0
- 【数据结构&&算法系列】堆排序简单介绍及其实现
- 【数据结构&&算法系列】快速排序简单介绍及实现
- 【数据结构&&算法系列】插入排序简单介绍及python代码
- 【数据结构&&算法系列】归并排序简单介绍及python代码
- 数据结构 堆排序原理及其实现
- 数据结构+算法系列四:I 堆排序
- 堆排序算法及其Java实现
- 算法基础:堆排序原理及其实现
- 数据结构算法之排序系列Java、C源码实现(4)--堆排序
- java实现简单排序算法:堆排序
- 数据结构:堆排序算法的实现
- 算法实现系列第二章.堆排序
- python算法实现系列-堆排序
- 【数据结构&&算法】堆排序
- [数据结构] 堆排序算法
- 【数据结构与算法】【排序】堆排序的代码实现
- java数据结构排序之堆排序算法实现
- 排序算法总结(简单选择排序、堆排序)(python实现)
- 在adb命令与ddms中能检测设备,但在eclipse中Run Configurations中检测不到真机
- Linux系统调用及用户编程接口(API)学习
- SQL2014学习笔记3--内存优化表的事务
- Mac终端命令 统计iOS工程中代码行数
- 民营物流公司迫切需要政策支持
- 【数据结构&&算法系列】堆排序简单介绍及其实现
- PE文件添加Overlay
- ZYNQ结构简介
- ORA-01480:STR 赋值变量缺少空后缀
- error C4189
- Android中asset文件夹和raw文件夹区别
- Codeforces 420 C. Bug in Code
- 从代码看OpenStack启动虚拟机的过程
- 教你如何赚钱-白手起家项目