排序之 堆排序

按照算法导论上的实现,不过把下标改成从0开始了。

原理:

 

 

 

 

 

import java.util.Arrays;

public class Solution {
    /**
     * 每次将堆顶元素交换到最后并从堆中除掉。
     * 
     * @param a
     */
    public static void heapSort(int[] a) {
        buildHeap(a);
        int n = a.length - 1;
        for (int i = a.length - 1; i > 0; i--) {
            swap(a, 0, i);
            // 堆的大小每次减1
            maxHeapify(a, n--, 0);
        }
    }

    /**
     * O(n)时间建堆
     */
    private static void buildHeap(int[] a) {
        for (int i = a.length / 2; i >= 0; i--)
            maxHeapify(a, a.length, i);

    }

    /**
     * n 表示当前堆的大小
     */
    private static void maxHeapify(int[] a, int n, int i) {
        int l = left(i);
        int r = right(i);
        int largest = i;

        if (l < n && a[l] > a[i])
            largest = l;

        if (r < n && a[r] > a[largest])
            largest = r;

        if (largest != i) {
            swap(a, i, largest);
            maxHeapify(a, n, largest);
        }

    }

    private static void swap(int[] a, int i, int j) {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;

    }

    private static int left(int i) {
        return 2 * i + 1;
    }

    private static int right(int i) {
        return 2 * i + 2;
    }

    public static void main(String[] args) {
        int[] a = { 2, 8, 7, 1, 3, 5, 6, 4 };
        System.out.println("before sorting:" + Arrays.toString(a));
        heapSort(a);
        System.out.println("after sortint:" + Arrays.toString(a));

    }

}

 

posted @ 2014-08-14 22:12  jdflyfly  阅读(214)  评论(0编辑  收藏  举报