美文网首页
2019-05-23堆排

2019-05-23堆排

作者: 咣超 | 来源:发表于2019-05-23 15:13 被阅读0次
    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堆排

          本文链接:https://www.haomeiwen.com/subject/zkxbzqtx.html