标签:private code text void 数组下标 等于 pac 简单选择 style
堆排序是简单选择排序的一种改进,改进的着眼点是:如何减少关键码的比较次数。
简单选择排序在一趟排序中仅选出最小关键码,没有把一趟比较结果保存下来,因而记录的比较次数较多。
堆排序在选出最小关键码的同时,也找出较小关键码,减少了在后面的选择中的比较次数,从而提高了整个排序的效率。
堆是具有下列性质的完全二叉树:
每个结点的值都小于或者等于其左右孩子结点的值(称为小根堆);
或者每个结点的值都大于或等于其左右孩子结点的值(称为大根堆);
堆排序对原始记录的排列状态并不敏感,相对于快速排序,这是堆排序最大的优点。
排序方法 | 最差时间分析 | 最好时间分析 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 |
1 package sort; 2 3 public class HeapSort { 4 public static void main(String[] args) { 5 HeapSort heapSort = new HeapSort(); 6 int[] array = {11,7,6,1,8,4,3,2,5}; 7 array = heapSort.heapSort(array); 8 for(int i: array){ 9 System.out.print(i + " "); 10 } 11 } 12 13 //堆排序 14 public int[] heapSort(int[] array){ 15 //初始化堆,array[0]为第一趟值最大的元素 16 for(int i = (array.length-1)/2;i>=0;i--) 17 adjustDownToUp(array, i, array.length); 18 //进行排序 19 for(int i= array.length-1; i > 0; i--){ 20 int temp=array[0]; 21 array[0] = array[i]; 22 array[i] = temp;//交换值 23 //然后将剩下的无序元素继续调整为大根堆 24 adjustDownToUp(array, 0, i); 25 } 26 return array; 27 } 28 //将元素array[k]自下向上逐步调整树形结构,数组下标从0开始 29 private void adjustDownToUp(int[] array, int k, int length){ 30 int temp = array[k]; 31 for(int i = 2*k + 1; i < length-1; i = 2*i+1){//i初始化为节点k的左孩子 32 //比较k的左右孩子节点,选择较大的节点 33 if(i+1 < length && array[i] < array[i+1]){ 34 i++;//如果k的右孩子>左孩子,则i指向右孩子 35 } 36 if(temp >= array[i]){ 37 //如果根节点大于等于左右孩子的较大者,则本次调整结束 38 break; 39 }else{ 40 array[k] = array[i];//将左右节点中较大值赋值给k 41 k = i;//修改k值(关键),以便继续向下调整 42 } 43 } 44 array[k] = temp; 45 } 46 }
标签:private code text void 数组下标 等于 pac 简单选择 style
原文地址:http://www.cnblogs.com/fankongkong/p/7287325.html