2019-05-23堆排

package 排序算法;

import java.util.Arrays;

public class HeapSort {  // 堆排序
    public static void heapSort(int[] arr) {
        if(arr.length < 2 || arr == null) {
            return;
        }
        int heapsize = arr.length;
        for(int i = 0; i < arr.length; i++) {
            heapinsert(arr, i);
        }
        swap(arr, 0, --heapsize);
        while(heapsize > 0) {
            heapfiy(arr, 0, heapsize);
            swap(arr, 0, --heapsize);
        }
        System.out.println(Arrays.toString(arr));
    }
    public static void heapinsert(int[] arr, int index) {
        while(arr[index] > arr[(index - 1) / 2]) {  // 将整个堆调成大根堆左孩子 i*2+1 右孩子 i*2+2 父 (i-1)/2
            swap(arr, index, (index - 1) / 2);
            index = (index -1) / 2;
        }
    }
    public static void heapfiy(int[] arr, int index, int heapSize) {
        int left = index * 2 + 1;
        while(left < heapSize) {
            int largest = left + 1 < heapSize && arr[left + 1] > arr[left] ? left + 1 : left;
            // 如果这里个右孩子也就是 left + 1 < heapsize的话也就是没有右孩子了就只能选左孩子
            // 所以后面的三目运算符只能写成上面的样子
            largest = arr[largest] > arr[index] ? largest : index;
            if(largest == index) {
                break;
            }
            swap(arr, largest, index);
            index = largest;
            left = index * 2 + 1;   
        }
    }
    private static void swap(int[] arr, int index, int i) {
        int tmp = arr[index];
        arr[index] = arr[i];
        arr[i] = tmp;
    }
    public static void main(String[] args) {
        heapSort(new int[] {1, 5, 3, 2, 7, 9});
    }
}

你可能感兴趣的:(2019-05-23堆排)