堆排序
堆排序:
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。
堆:
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
堆排序的基本思想是:
1、将待排序序列构造成一个大顶堆(升序大顶堆,降序小顶堆)
2、此时,整个序列的最大值就是堆顶的根结点
3、将其与末尾元素进行交换,此时末尾就为最大值
4、如何将剩余n-1个元素重写构造成一个堆,这样就会得到n个元素的次小值。
如此反复执行,便能得到一个有序序列
时间复杂度:O(nlogn)
稳定度:不稳定
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| public static void heapSort(int[] arr) { for(int i = arr.length / 2 - 1; i >= 0; i--){ adjustHeap(arr, i, arr.length); } int temp; for(int i = arr.length - 1; i > 0; i-- ){ temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; adjustHeap(arr, 0, i); } }
public static void adjustHeap(int[] arr, int i, int length){ int temp = arr[i]; for(int k = i * 2 + 1; k < length; k = k * 2 + 1){ if(k + 1 < length && arr[k] < arr[k+1]){ k++; } if(arr[k] > temp) { arr[i] = arr[k]; i = k; } else { break; } } arr[i] = temp; }
|
参考文章
图解排序算法(三)之堆排序
满二叉树、完全二叉树、平衡二叉树、最优二叉树