小根堆實現

若是有一個關鍵字的集合K={k0,k1,k2, ..., kn-1}, 把全部元素按徹底二叉樹的順序存儲
方式存放在一個一維數組中,而且知足
ki <= k2i+1 且 ki <= k2i+2 (i = 0, 1, ..., (n-2)/2 向上取整)
則稱這個集合爲小根堆。java

建立數組

  1. 複製堆數組測試

  2. 找到最初的調整位置,即最後一個分支結點code

  3. 自底向上逐步擴大造成堆排序

  4. 向前換一個分支結點ast

插入class

  1. 將待插入元素插入已建成堆的最後面import

  2. 沿着出入位置所在的分支逐步向上調整二叉樹

刪除im

  1. 將頂元素刪除

  2. 將數組中最後一個元素放到堆頂

  3. 自頂向下調整

代碼實現

import java.util.Arrays;

/**
 * Created by mico on 2017/2/5.
 */
public class HeapExam {
    /**
     * 小根堆初始化
     *
     * @param a
     * @param length
     */
    public void minHeap(int a[], int length) {
        for (int i = length >> 1; i >= 0; i--) {
            adjustMinHeap(a, length, i);
        }
    }

    /**
     * 排序 topn
     *
     * @param a
     * @param length
     */
    public void sort(int a[], int length) {
        for (int i = 0, last = length; i < length - 1; i++) {
            swap(a, 0, --last);
            minHeap(a, last);

        }
    }


    /**
     * 小根堆調整
     *
     * @param a
     * @param length
     * @param i
     */
    private void adjustMinHeap(int[] a, int length, int i) {
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int minIndex = i;
        if (left < length && a[left] < a[i]) {
            minIndex = left;
        }
        if (right < length && a[right] < a[minIndex]) {
            minIndex = right;
        }
        if (minIndex != i) {
            swap(a, i, minIndex);
            adjustMinHeap(a, length, minIndex);
        }

    }


    /**
     * 交換 數組值
     *
     * @param a
     * @param i
     * @param j
     */
    private void swap(int[] a, int i, int j) {
        a[i] = a[i] + a[j];
        a[j] = a[i] - a[j];
        a[i] = a[i] - a[j];
    }


}

測試

public static void main(String[] args) {
        int[] a = {153, 173, 728, 9, 425, 165, 7, 233};
        //int[] arry_int={13, 38, 27, 55, 76, 65, 49, 97};
        HeapExam exam = new HeapExam();
        exam.minHeap(a, a.length);
        System.out.println("小根堆:" + Arrays.toString(a));
        exam.sort(a, a.length);
        System.out.println("排序結果:" + Arrays.toString(a));
    }

輸出

小根堆:[7, 9, 153, 173, 425, 165, 728, 233]
排序結果:[728, 425, 233, 173, 165, 153, 9, 7]
相關文章
相關標籤/搜索