复杂度nlog(n)之堆排序
来源:互联网 发布:linux私房菜 第四版 编辑:程序博客网 时间:2024/06/08 12:57
1.简单的介绍
堆排序是利用特殊二叉树大顶堆和小顶堆进行排序的算法,通过将数组转化成大顶堆(满足array[n]>array[2n+1]和array[n]>array[2n+2]这两个条件),然后将array[0]和array[array.length-1]交换,然后将无序区重新构建大顶堆。重复之前的步骤知道所有的都变成有序区。
步骤:
1.将数组变成大顶堆。
2.将array[0]和array[array.length-1]交换。
3.将无序区域重新构建大顶堆。
4.循环直至所有区域都有序。
2.核心的maxheap函数
public static void maxheap(int[] array, int length, int index) { int left = getleftindex(index); int right = getrightindex(index); int largest = index; if (left < length && array[left] > array[largest]) { largest = left; } if (right < length && array[right] > array[largest]) { largest = right; } if (largest != index) { int temp = array[index]; array[index] = array[largest]; array[largest] = temp; maxheap(array, length, largest); } }
上面就是利用递归建立最大堆得过程,大致的步骤是这样的:
1.先找到当前节点的左子树。
2.找到当前节点的右子树。
3.在左右子树不超出范围的情况下,比较三者的大小,将最大的节点记录下。
4.假如当前最大的节点不是父节点,那么交换他们的位置,满足父节点最大。因为移动了下面子树,所以移动的子树要重新建堆。
3.完整的代码
public static void buildmaxheap(int[] array) { int startindex = getparentindex(array.length - 1); for (int i = startindex; i >= 0; i--) { maxheap(array, array.length, i); } } public static void maxheap(int[] array, int length, int index) { int left = getleftindex(index); int right = getrightindex(index); int largest = index; if (left < length && array[left] > array[largest]) { largest = left; } if (right < length && array[right] > array[largest]) { largest = right; } if (largest != index) { int temp = array[index]; array[index] = array[largest]; array[largest] = temp; maxheap(array, length, largest); } } public static void heapsort(int[] array, int length) { buildmaxheap(array); for (int i = length - 1; i > 0; i--) { int data = array[0]; array[0] = array[i]; array[i] = data; maxheap(array, i, 0); } for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } public static int getparentindex(int index) { return (index - 1) >> 1; } public static int getleftindex(int index) { return (index << 1) + 1; } public static int getrightindex(int index) { return (index << 1) + 2; } public static void main(String[] args) { int[] array = { 2, 1, 4, 3, 5, 6, 4, 9, 7, 8 }; heapsort(array, array.length); }
利用递归不停地分割,一直到start和end相同时,就是数组被分成一个一个数的时候,这样这个数据就变成有序的了。
1 0
- 复杂度nlog(n)之堆排序
- 复杂度nlog(n)之快速排序
- 复杂度nlog(n)之归并排序
- 堆排序(O(nlog(n))
- 插入排序复杂度为什么不是nlog(n)
- 归并排序、快速排序---时间复杂度为O(nlog n)的排序方式
- 快速排序改进版,时间复杂度为:O(nk+nlog(n/k))
- 堆排序建堆复杂度为O(n)的证明
- 矩阵就地转置+O(Nlog(N))时间复杂度
- 8大排序之-------堆排序与时间复杂度
- Leetcode中常用排序 之 O(n)时间复杂度排序
- 堆排序中--建堆的算法复杂度分析O(n)
- 堆排序建堆复杂度为O(n)的证…
- 快速排序——非稳定排序nlog(n)
- 排序算法之 堆排序 及其时间复杂度和空间复杂度
- 排序算法之 堆排序 及其时间复杂度和空间复杂度
- 堆排序算法复杂度解析
- 堆排序时间复杂度理解
- 实验项目2-7:素因子分解
- hd 1789 Doing Homework again
- Android--选择对话框--AlertDialog
- spring jdbc:initialize-database使用详解
- 阅读Logback文档笔记--Logback的Encoder配置
- 复杂度nlog(n)之堆排序
- eclipse下SpringBoot开发和测试
- android6.0系统Healthd深入分析
- Linux命令--ls
- Notification通知 模拟下载 小例子
- ubuntu memcached启动脚本
- SCU2016-07 N题 概率dp
- 欢迎使用CSDN-markdown编辑器
- Android音频焦点