算法之排序小结3---堆排序(Java)

来源:互联网 发布:用cad画网络拓扑图 编辑:程序博客网 时间:2024/06/11 03:47
public class heapSort { //维护最大堆性质的重要过程.即每次调整都是//从父节点、左孩子节点、右孩子节点三者中选择最大者跟父节点进行交换(交换之后可能造成被交换的孩子节点不满足堆的性质,因此每次交换之后要重新对被交换的孩子节点进行调整)。public  static void maxHeapModiify(int []A, int i,int size){int left,right,largest;if(i < size/2) {  //若是i不小于长度的一半,则不进行修正,就是对叶子节点不修正if(i == 0){left = 1;right = 2;}else{left = 2*i + 1;right = 2*i + 2;}if(left <= size && A[left] > A[i])//必须是左节点先处理,{largest = left;}elselargest = i;if(right < size && A[right] > A[largest]){largest = right;}if(largest != i){int tmp = A[i];A[i] = A[largest];A[largest] = tmp;maxHeapModiify(A,largest,size);}}}public static void buidHeap(int A[],int size){int i = size/2-1;for(;i>=0; i--)//注意:实际数组是从下标0开始的,maxHeapModiify(A, i,size);   //i值是有约束的}public  static void  heapSort1(int []A,int size){buidHeap(A,size);for(int i = A.length - 1; i>=1; i--){int tmp = A[i];A[i] = A[0];A[0] = tmp;maxHeapModiify(A,0,i);}}public static void main(String[] args) {// TODO Auto-generated method stubint []A = {16,7,3,20,17,8,9,5,12};heapSort1(A,A.length);for(int i = 0; i < A.length; i++){System.out.print(A[i]+" ");}}}


具体原理参考<算法导论>

点击打开链接http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html


0 0
原创粉丝点击