算法基础之排序篇-堆排序
来源:互联网 发布:淘宝模特红人安天天 编辑:程序博客网 时间:2024/05/17 04:51
1、算法描述
利用堆(大根堆或小根堆)这种数据结构所设计的一种算法。
堆:堆是一个特定的完全二叉树,树中的任一节点的值都不大于(或不小于)其左右孩子(如果存在)节点的值。
操作步骤(以大根堆为例)
初始序列无需区R(1,n),有序区为空
(1)、对无序区建大根堆。
(2)、交换大根堆的堆顶和堆的最后一个元素,得到新的无序区以及有序区
(3)、重复(1)(2)直至无序区的元素个数为1
(4)、对整棵树做顺序访问
2、图例
3、代码
public void sort(int[] data) {MaxHeap mh = new MaxHeap(data);mh.remove(data);}class MaxHeap {public MaxHeap() {}// 构建堆public MaxHeap(int[] data) {if (data.length <= 1)return;int i = data.length - 1;while (i > 0) {int j = i >> 1;if (data[i] > data[j]) {swap(data, i, j);}i--;this.size++;}this.size++;}// 调整堆private void formatHeap(int[] data) {if (this.size <= 1)return;int j = 0;int k = (j + 1) << 1;while (k <= this.size) {if (k < this.size) {if (data[k - 1] > data[k]) {k--;}} else {k--;}if (data[k] <= data[j]) {break;}swap(data, k, j);j = k;k = (j + 1) << 1;}}public void remove(int[] data) {while (this.size > 1) {swap(data, 0, --this.size);if (this.size == 1)break;formatHeap(data);}}int size;}
4、稳定性和复杂度
稳定性:堆排序是不稳定的排序
平均时间复杂度:O(nlongn)
堆排序的时间复杂度主要由构建堆和调整堆决定。构建堆是O(n),每一次调整堆的时间复杂度为O(longn),调整了n-1次。
空间复杂度:O(1)
- 算法基础之排序篇-堆排序
- 算法基础之----堆排序
- 基础算法总结之堆排序算法
- 【基础算法】排序-复杂排序之三(堆排序)
- 基础算法-堆排序
- 基础算法-堆排序
- 基础算法-堆排序
- 基础算法系列(十七)排序算法之堆排序
- 基础算法之四--排序:之堆排序
- 排序算法之堆排序
- 排序算法之堆排序
- 排序算法之 堆排序
- 排序算法之堆排序
- 排序算法之堆排序
- 排序算法之堆排序
- 排序算法之堆排序
- 排序算法之堆排序
- 排序算法之堆排序
- linux系统时间和硬件时钟问题(date和hwclock)
- 1.[算法]不使用*、/、+、-、%操作符求一个数的1/3
- 为什么《30天自制操作系统》封面中的猫是两只尾巴
- 如何用一段SQL语句递归找到一个目录下的所有子目录...
- C# 泛型编程之泛型类、泛型方法、泛型约束
- 算法基础之排序篇-堆排序
- linux系统基本配置
- linux系统引导时出现error:couldn't mount because of unsupported optional features(240)的解决方案
- java md5加密
- MySQL中进行树状所有子节点的查询
- JPA一对一双向关联实例
- DbgPrint/KdPrint输出格式控制 PS:mark一下
- STL容器如何正确调用自己的erase方法
- 夏时制英国和中国的时差是多少?伦敦与北京时差是多少?