排序(三)之堆排序
2017-12-29 00:38
134 查看
由堆的性质可知,由于每个 DeleteMin 花费的时间为 O(logN),因此总的运行时间是 O(NlogN)。但该算法的主要问题在于它使用了一个附加数组。
排序算法(七)——堆排序
白话经典算法系列之七 堆与堆排序
避免使用第二个数组的方法:
在每次 DeleteMin 之后,堆缩小了 1 。因此,位于堆中最后的单元可以用来存放刚刚删去的元素。例如:设我们有一个堆,它包含六个元素。第一次 DeleteMin 产生一个 A1。现在只有五个元素,因此我们可以把 A1 放在位置6上。下一次 DeleteMin 产生一个 A2,由于该堆现在只有四个元素,因此我们把 A2 放到位置 5 上。#define LeftChild(i) 2 * i + 1 void percDown(ElementType arr[], int i, int n) { int child; ElementType tmp; for(tmp = arr[i]; LeftChild(i) < n; i = Child) { child = LeftChild(i); if(child != n - 1 && arr[child + 1] > arr[child]) { child++; } if(tmp < arr[child]) { arr[i] = arr[child]; } else { break; } } arr[i] = tmp; } void heapSort(ElementType arr[], int n) { int i; for(i = n / 2; i >= 0; i--) //BulidHeap { percDown(arr, i, n); } for(i = n - 1; i > 0; i--) { //DeleteMax //same: swap the min element and the max element swap(arr[0], arr[i]); percDown(arr, 0, i); } }
参考:
堆排序原理及算法实现(最大堆)排序算法(七)——堆排序
白话经典算法系列之七 堆与堆排序
相关文章推荐
- 排序专题(四) / 不稳定的内部排序 / 堆排序
- 排序之三:堆排序
- [C++]数据结构:排序算法Part1----冒泡排序、选择排序、插入排序、堆排序
- 简单排序算法之堆排序
- 2.选择排序:直接选择排序和堆排序
- 选择排序——一般选择排序,堆排序
- 排序算法2--简单选择排序、堆排序
- Java常见排序算法之堆排序
- 一步一步搞清排序之堆排序(JAVA)
- 常用算法总结之排序(六)----堆排序
- 排序--堆排序
- 经典排序之 堆排序
- 排序练习【sdut 1582】【堆排序】
- 快速排序 冒泡排序 归并排序 堆排序 的主要代码
- 排序(6)堆排序
- java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序
- 常用排序算法——插入排序,快速排序,归并排序,堆排序,计数排序
- 1.排序算法--选择排序和堆排序
- 数据结构和算法系列6 七大排序之直接选择排序和堆排序
- Java排序之堆排序