1、概述java
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似彻底二叉树的结构,并同时知足堆积的性质:即子结点的键值或索引老是小于(或者大于)它的父节点。git
排序方法 | 时间复杂度(平均) | 时间复杂度 (最坏) | 时间复杂度(最好) | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
堆排序 | $O(nlogn)$ | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
在堆的数据结构中,堆中的最大值老是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义如下几种操做:github
1.一、说明算法
不断将大根堆的堆顶元素与堆尾元素交换,再重建大根堆的过程。将待排序列构建成大根堆,用变量 heapSize 来控制堆的大小,而后不断地 heapify ,直到 heapSize 等于零。在 heapify 的过程当中就是先比较子节点的大小,而后比较父节点和子节点的大小,若是最后发现父节点是比子节点大的话跳出 heapify 循环,不然将子节点与父节点交换,而且找到子节点的左孩子,再重复上诉过程,直到左孩子的位置 left 大于 heapSize ,heapify 循环结束.api
1.二、代码实现数据结构
public class HeapSort { public static void heapSort(int [] arr){ if(arr == null || arr.length < 2){ return; } for(int i = 0; i< arr.length; i++){ heapInsert(arr,i); } int heapSize = arr.length; swap(arr, 0, --heapSize); while(heapSize > 0){ heapify(arr, 0, heapSize); swap(arr, 0, --heapSize); } } private static void heapInsert(int[] arr, int index){ while(arr[index] > arr[(index - 1) / 2]){ swap(arr, index, (index -1)/2); index = (index -1) / 2; } } private static void heapify(int[] arr, int index, int heapSize){ int left = index * 2 + 1; while(left < heapSize){ int largest = left + 1 < heapSize && arr[left + 1] > arr[left] ? left + 1 : left; largest = arr[largest] > arr[index] ? largest : index; if(largest == index){ break; } swap(arr, largest, index); index = largest; left = index * 2 +1; } } private static void swap(int[] arr, int i, int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } }
代码地址:地址 中的algorithm-001-sort中 HeapSort ui
发送到spa