Java堆的实现和堆排序

public class Heap {

    private int[] a; // 数组,从下标1开始存储数据
    private int n;  // 堆可以存储的最大数据个数
    private int count; // 堆中已经存储的数据个数

    public Heap(int capacity) {
        a = new int[capacity + 1];
        n = capacity;
        count = 0;
    }

    public void insert(int data) {
        if (count >= n) return; // 堆满了
        ++count;
        a[count] = data;
        int i = count;
        while (i/2 > 0 && a[i] > a[i/2]) { // 自下往上堆化
            swap(a, i, i/2); // swap()函数作用:交换下标为i和i/2的两个元素
            i = i/2;
        }
    }


    public void removeMax() {
        // 堆中没有数据
        if (count == 0) return;
        a[1] = a[count];
        --count;
        heapify(a, count, 1);
    }

    private static void heapify(int[] a, int n, int i) {
        while (true) {
            int maxPos = i;
            if (i*2 <= n && a[i] < a[i*2]) maxPos = i*2;
            if (i*2+1 <= n && a[maxPos] < a[i*2+1]) maxPos = i*2+1;
            if (maxPos == i) break;
            swap(a, i, maxPos);
            i = maxPos;
        }
    }


    private static void swap(int[] a, int p, int r) {
        int tmp = a[p];
        a[p] = a[r];
        a[r] = tmp;
    }
}

下面的是堆排序

/**
 * 堆排序
 */
public class HeapSort {

    /**
     * 排序
     * 

* 堆元素是从数组下标0开始 * * @param arr */ public static void sort(int[] arr) { if (arr.length <= 1) { return; } // 1、建堆 buildHeap(arr); // 2、排序 int k = arr.length - 1; while (k > 0) { // 将堆顶元素(最大)与最后一个元素交换位置 swap(arr, 0, k); // 将剩下元素重新堆化,堆顶元素变成最大元素 heapify(arr, --k, 0); } } /** * 建堆 * * @param arr */ private static void buildHeap(int[] arr) { // (arr.length - 1) / 2 为最后一个叶子节点的父节点 // 也就是最后一个非叶子节点,依次堆化直到根节点 for (int i = (arr.length - 1) / 2; i >= 0; i--) { heapify(arr, arr.length - 1, i); } } /** * 堆化 * * @param arr 要堆化的数组 * @param n 最后堆元素下标 * @param i 要堆化的元素下标 */ private static void heapify(int[] arr, int n, int i) { while (true) { // 最大值位置 int maxPos = i; // 与左子节点(i * 2 + 1)比较,获取最大值位置 if (i * 2 + 1 <= n && arr[i] < arr[i * 2 + 1]) { maxPos = i * 2 + 1; } // 最大值与右子节点(i * 2 + 2)比较,获取最大值位置 if (i * 2 + 2 <= n && arr[maxPos] < arr[i * 2 + 2]) { maxPos = i * 2 + 2; } // 最大值是当前位置结束循环 if (maxPos == i) { break; } // 与子节点交换位置 swap(arr, i, maxPos); // 以交换后子节点位置接着往下查找 i = maxPos; } } private static void swap(int []arr,int a,int b){ if (a==b)return; int tmp = arr[a]; arr[a] = arr[b]; arr[b] = tmp; } public static void main(String[] args) { int [] a = {2,2,1,2,4,5,1,6,9}; sort(a); System.out.println(Arrays.toString(a)); } }

 

你可能感兴趣的:(数据结构与算法学习,数据结构与算法)