堆排序

来源:互联网 发布:卓智网络是培训公司吗 编辑:程序博客网 时间:2024/06/05 02:35

记录下堆排序。。。。

堆排序的步骤:

1)根据给定的数组建立堆结构,维护堆的性质;

2)排序:每次将堆顶与最后一个元素(不算堆顶互换过来的)互换,再维护 第一个元素至最后一个元素 的堆性质,重新维护堆。。。依此循环


import java.util.Arrays;public class HeapMakeTest {public static void main(String[] args) {int[] num = {1,2,5,3,9,7,4,8};HeapMakeTest hmt = new HeapMakeTest();hmt.makeHeap(num,num.length);System.out.println(Arrays.toString(num));hmt.heapSort(num, num.length);System.out.println(Arrays.toString(num));}// 建立一个大顶堆,从最后一个元素的双亲节点开始public void makeHeap(int[] num,int length){for(int i=(length-1-1)/2;i>=0;i--)adjustHeap(num,i,length);}public void adjustHeap(int[] num, int k, int length){int temp = num[k];                   // 记录父节点的值for(int i=2*k+1;i<length;i=2*i+1){   //  i=2*i+1  不断的往孩子节点方向调整,因为父节点与孩子节点交换后,孩子树中可能不满足堆的性质if(i+1<length && num[i]<num[i+1])i++;                         // 找到左、右孩子节点中的最大值if(temp>=num[i])break; // 如果父节点大于孩子节点,不需要调整else{num[k]=num[i];               // 孩子节点赋值给父节点k = i; // 记录需要更新的节点位置}}num[k]=temp;                         // 更新上述k下标节点的值}// 堆排序public void heapSort(int[] num,int length){// 数组首部与数组尾部交换,即堆的顶挪到“相对”最后一位,(不算来自堆顶的元素),再将其余的数组元素重建堆,依此循环for(int i=0;i<length;i++){int tmp = num[0];num[0]=num[length-1-i];num[length-1-i]=tmp;makeHeap(num,length-1-i);}}}


0 0
原创粉丝点击