堆排序

笑着哭i 提交于 2020-02-11 15:19:40

堆排序属于不稳定排序,时间复杂度为O(nlogn),是利用堆这种数据结构设计的排序算法,是一种选择排序

堆是一个近似完全二叉树的结构,每个节点值都大于或等于左右节点为大顶堆,小于等于为小顶堆

升序排序大顶堆,降序排序小顶堆

思想和方法:将原始数据构 n 造成大顶堆,此时最大值为根节点,然后与末尾的原始数据交换,最后即为最大值,然后剩下的 n - 1 个数据继续构建大顶堆,重复上面的步骤,最后一个数直接置于第一位,至此升序排序完成

import java.util.Arrays;

public class HeapSort {

    public static void main(String[] args) {
        int arr[] = {4, 6, 8, 5, 9};
        heapSort(arr);
    }

    public static void heapSort(int[] arr) {
        int temp;
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            adjustHeap(arr, i, arr.length);
        }
        for (int j = arr.length - 1; j > 0; j--) {
            temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            adjustHeap(arr, 0, j);
        }
        System.out.println(Arrays.toString(arr));
    }

    /**
     * @param arr    待调整数组
     * @param i      非叶子节点在数组中的索引
     * @param lenght 表示对多少个元素减少(逐渐减少)
     */
    public static void adjustHeap(int arr[], int i, int lenght) {
        int temp = arr[i];
        //k = i * 2 + 1 是i的左子节点
        for (int k = i * 2 + 1; k < lenght; k = k * 2 + 1) {
            if (k + 1 < lenght && arr[k] < arr[k + 1]) {
                k++;//k指向右子节点
            }
            if (arr[k] > temp) {
                arr[i] = arr[k];
                i = k;//i 指向 k, 继续循环比较
            } else {
                break;
            }
        }
        arr[i] = temp;//将temp值放到调整后的位置
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!