堆排序

又一个高效的排序。

这个排序算法的基础是大根堆的操作。主要用到的基本操作是将元素下移至适当位置。

大根堆即根结点大于叶子结点,通过将一个普通数组的元素从底层开始不断向下移到适当位置,即构造完毕。在排序的时候,通过每次将第一个元素与“最后”的元素交换,再将根结点移到适当的位置。需要注意的是,这个“最后”是指每趟排序都压缩数组后的长度。

另外,由0开始存储元素,左结点是2*i+1,右结点是2*i+2.

public static void heapSort(int[] A){
    makeHeap(A);
    for(int i = A.length-1; i > 0; i --){
        swap(A, 0, i);
        siftDown(A, i, 0);
    }
}

private static void siftDown(int[] A, int len, int i){
    while(2*i+1 <= len-1){
        i = 2*i+1;
        if(i+1 <= len-1 && A[i] < A[i+1]) i ++;
        if(A[(i-1)/2] < A[i])
            swap(A, (i-1)/2, i);
        else
            break;
    }
}

private static void makeHeap(int[] A){
    //max heap
    for(int i = (A.length-1-1)/2; i >= 0; i --){
        siftDown(A, A.length, i);
    }
}
Java

 

posted @ 2013-10-21 21:04  7hat  阅读(254)  评论(0编辑  收藏  举报