zoukankan      html  css  js  c++  java
  • 堆排序

    好比一个漏斗,里面有木球,乒乓球,钢球。如果我们晃动这个漏斗,在重力作用下,最重的钢球就会现在漏斗底部(根节点)。拿走钢球,再晃动漏斗,次重的木球就会出现在底部。这三种球就按重力顺序排好了。
    堆排序通过调整堆(adjustHeap),维持大顶堆。就好比我们通过晃动漏斗(adjustHeap),使最大重力球不断出现在漏斗底部的过程。
            
       public static void heapSort(int arr[]) {
            int temp = 0;
            System.out.println("堆排序!!");
    
            //注:因为调整堆方法(adjustHeap)成功的前提是子树必须是一个大顶堆或小顶堆,所以从无序堆构建第一个大(小)定堆时,
    //需要从最下面一个非叶子结点开始,依次遍历所有非叶子结点构建。
    // 将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆 for (int i = arr.length / 2 - 1; i >= 0; i--) { adjustHeap(arr, i, arr.length); } /** 2).将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端; 3).重新调整结构,使其满足堆定义,
    *然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换 步骤,直到整个序列有序。
    */ 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)); } //将一个数组(二叉树), /** * 功能: 完成 将 以 i 对应的非叶子结点的树调整成大顶堆 * 举例 int arr[] = {4, 6, 8, 5, 9}; => i = 1 => adjustHeap => 得到 {4, 9, 8, 5, 6} * 如果我们再次调用 adjustHeap 传入的是 i = 0 => 得到 {4, 9, 8, 5, 6} => {9,6,8,5, 4} * * @param arr 待调整的数组 * @param i 表示一个轻球在晃动漏斗过程中,查找自己正确位置 * @param lenght 表示对多少个元素继续调整, length 是在逐渐的减少 */ public static void adjustHeap(int arr[], int i, int lenght) { int temp = arr[i];//先取出当前元素的值,保存在临时变量 // 开始调整 // 说明 // 1. k = i * 2 + 1 k 是 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;//! } } //当 for 循环结束后,我们已经将以 i 为父结点的树的最大值,放在了 最顶(局部) arr[i] = temp;//将 temp 值放到调整后的位置 }
  • 相关阅读:
    (分享)视频压缩Free Video Compressor 汉化版/中文版【全网唯一】
    (分享)根据IP获取地理位置(百度API)
    易语言5.6 精简破解版[Ctoo]
    性能测试---流程篇
    性能测试--系统资源配置篇
    结合sqlmap进行sql注入过程
    MySQL使用记录
    Oracle创表操作记录
    Oracle常用函数记录
    Oracle使用记录
  • 原文地址:https://www.cnblogs.com/wllhq/p/13639700.html
Copyright © 2011-2022 走看看