码迷,mamicode.com
首页 > 其他好文 > 详细

排序值 堆排序

时间:2014-08-14 23:40:16      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   java   os   io   for   

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

原理:

bubuko.com,布布扣

 

bubuko.com,布布扣

bubuko.com,布布扣

 

 

 

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));

    }

}

 

排序值 堆排序,布布扣,bubuko.com

排序值 堆排序

标签:style   blog   http   color   java   os   io   for   

原文地址:http://www.cnblogs.com/jdflyfly/p/3913571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!