堆排序(heapsort)
来源:互联网 发布:filezilla是什么软件 编辑:程序博客网 时间:2024/05/28 23:22
堆排序
堆排序是利用堆结构(特殊的完全二叉树)实现排序的算法,时间复杂度是O(nlogn)。堆排序不稳定。
原理
堆排序要构建一颗完全二叉树(存储在数组,详见: 二叉树的数组存储),这颗二叉树就是堆。堆有大堆和小堆两种(结构类似)。这里以大堆为例。
在最大堆中每个节点都比子节点大,根节点最大,每个分枝都是一个堆,叶子节点天然就是堆。
构成一个堆之后。然后取堆首-重新构建堆-再取… 元素按大到小依次取出(原地排序),完成排序。
示例代码如下:
public class Heapsort { void sort(int[] arr){ //建堆,叶子节点已经是堆了,所以从非叶子节点开始建堆 for(int i = arr.length/2-1; i >= 0; i--){ create(arr, i, arr.length - 1); } //取出跟节点(最大)与最后一个节点交换,然后修正堆 int i = arr.length-1;//i指向堆的末尾 while(i > 0){ int k = arr[0]; arr[0] = arr[i]; arr[i] = k; i--;//减小堆的规模,这样修正堆时,新的堆不包括刚取出的根节点。相当于不断取出最大的元素。依次形成序列(升序) create(arr, 0, i); } } //构建、维护堆 (大堆) //这里只考虑将给定节点调整到堆的合适位置 void create(int[] arr, int start, int end){ int node = start*2 + 1;//左子节点下标 //如果有子节点则进入,没有就说明要操作的节点是叶子节点,直接结束 while(node <= end){ //在两个字节点中挑一个最大的,(如果是小堆,就挑最小的) if(node+1 <= end && arr[node+1] > arr[node]){ node++; } //比较父节点和子节点,如果父节点大,说明堆是好的(不用交换),return。否则交换节点后向下迭代 if(arr[start] >= arr[node]){ return; }else{ int k = arr[start]; arr[start] = arr[node]; arr[node] = k; //重新设置父子节点下标,向下迭代,直到构成堆。 start = node; node = start*2+1; } } }}
阅读全文
0 0
- 堆排序(HeapSort)
- 堆排序(Heapsort)
- 堆排序 (Heapsort)
- 堆排序(heapsort)
- 堆排序(HeapSort)
- 堆排序(heapsort)
- 堆排序(heapsort)
- 堆排序(Heapsort)
- 堆排序(HeapSort)
- 堆排序(Heapsort)
- 堆排序(HeapSort)
- 堆排序(heapsort)
- 堆排序(HeapSort)
- 堆排序(1)HeapSort
- HeapSort(堆排序算法)
- HeapSort(堆排序)入门
- 排序算法 之 堆排序(heapsort)
- Java排序算法--堆排序(HeapSort)
- 神通广大的JS
- ECO论文翻译:Efficient Convolution Operators for Tracking论文翻译
- C语言中auto,register,static,const,volatile的区别详细解析
- ps备忘2
- php 不等待返回的实现方法(异步调用)
- 堆排序(heapsort)
- jQuery基础教程第四版 第3章学习笔记
- 深度学习与计算机视觉 看这一篇就够了
- 写了个最low的"多"条件查询,JDBC实现,记录一下。
- ListView与BaseAdapter的优化
- SpringMvc 文件上传
- DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络
- HTML5里video标签支持哪些格式的视频文件?
- Android 开发调用相机拍照如何获取清晰照片