数据结构与算法(七)

72 阅读1分钟

堆排序

  • 先让整个数组都变成大根堆结构,建立堆的过程:
    • 从上到下的方法,时间复杂度为O(N*logN)
    • 从下到上的方法,时间复杂度为O(N)
  • 把堆的最大值和堆末尾的值交换,然后减少堆的大小之后,再去调整堆,一直周而复始,时间复杂度为O(N*logN)
  • 堆的大小减小成0之后,排序完成
public static void heapSort(int[] arr) {
        if(arr ==null || arr.length<1){
            return;
        }
        int length = arr.length;
        //将数组转为堆结构
        for (int i = arr.length - 1; i >= 0; i--) {
            heapify1(arr, i, length);
        }



        //将顶部和末端的切换并减小size
        while (length > 0) {
            swap(arr, 0, --length);
            heapify1(arr, 0, length);
        }


    }

    private static void heapify1(int[] arr, int i, int length) {
        int left = i * 2 + 1;
        while (left < length) {
            int largest = (left + 1) < length && arr[left] < arr[left + 1] ? (left + 1) : left;
            int largest_arr = arr[largest];
            if (largest_arr > arr[i]) {
                arr[largest] = arr[i];
                arr[i] = largest_arr;
                i = largest;
                left = i * 2 + 1;
            } else {
                break;
            }
        }


    }

    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }