美文网首页
堆排序-生成新的数组

堆排序-生成新的数组

作者: 执着的人请保持微笑 | 来源:发表于2023-05-07 09:34 被阅读0次

//排序数组生成堆的方法

  void createPile(List sortArray, int childIndex)

  {

    int child = childIndex;

    int parent = (child-1) ~/ 2;

    while (child > 0) {

      if (sortArray[child] < sortArray[parent]) {

        int replaceObject = sortArray[child];

        sortArray[child] = sortArray[parent];

        sortArray[parent] = replaceObject;

        child = parent;

        parent = (child-1) ~/ 2;

      }else

      {

        break;

      }

    }

  }

  //删除堆定元素后从新创建堆的方法

  void sortPile(List sortArray, int totalSize, int rootIndex){

    int parent = rootIndex;

    int child = parent*2+1;//左孩子的下标

    //如果孩子节点下标大于父节点的,说明已经不满足条件了,已经成堆了

    while (child < totalSize) {

      //选出左右孩子中最小的那个

      if ((child + 1 < totalSize) && (sortArray[child+1] < sortArray[child])) {

        child ++;

      }

      //如果最小的孩子比父节点的小,需要交换位置

      if (sortArray[child] < sortArray[parent]) {

        int replaceObject = sortArray[child];

        sortArray[child] = sortArray[parent];

        sortArray[parent] = replaceObject;

        parent = child;//父节点交换到了孩子节点

        child = parent*2+1;//计算新的孩子节点

      }else

      {

        //不满足的话就跳出循环

        break;

      }

    }

  }

//待排序数组

          var sortArray = [1,2,5,1000,500,200,49,100,50,40,30,20];

          //存放排好序的数据

          var finishArray = [];

          //打印待排序数组

          print(sortArray);

          for (var i = 0; i < sortArray.length; i++) {

            createPile(sortArray, i);//创建小顶堆

          }

          while (sortArray.length > 0) {

//取出小顶堆的堆顶元素

            finishArray.add(sortArray.first);

//交换堆顶元素和堆底元素位置

            int replaceObject = sortArray[0];

            sortArray[0] = sortArray[sortArray.length-1];

            sortArray[sortArray.length-1] = replaceObject;

//移除堆底元素,也就是小顶堆的堆顶元素

            sortArray.removeAt(sortArray.length-1);

//从新生成小顶堆

            sortPile(sortArray, sortArray.length, 0);

          }

          print("排完序的数组${finishArray}");

相关文章

  • 温习 6+2 种排序方式

    堆排序(实现难易:⭐⭐⭐) ① 将序列生成堆,调整成最大堆② 弹出堆顶,生成新序列,重复 ① 。 快速排序(实现难...

  • 排序

    原创 堆排序: 使用visit数组从本质出发获取大顶堆排序。

  • 五种排序算法时间对比(堆,归并,快排..)

    写了一下五种常见的排序算法(归并,快排,堆排序,插入排序,冒泡排序),通过排序同样的数组(随机生成0~100000...

  • 堆排序 ---应用篇

    上篇堆排序介绍堆排序的基本过程,本文说下堆排序的应用实例。 大纲 创建Huffman树 合并K个有序数组 1. 创...

  • 堆排序

    堆排序算法利用堆的结构来执行快速排序。 为了实现从最低到最高排序,堆排序首先将未排序的数组转换为最大堆,以便数组中...

  • 2021-09-07编程trick

    动态规划,仅仅与上一状态有关的,可以滚动数组 滚动数组时,一般生成一个新的数组,当作新数组,因为记忆数组需要在外部...

  • js.array 复制数组

    避免用遍历,类似map等能生成新的数组的就是了... 类数组的转换成数组

  • js数组去重

    1、要求将数组中的0项去掉,将不为0的值存入一个新的数组,生成新的数组 方法一 filter 方法二 2、数组[4...

  • 过滤数组,只保留正数

    直接在原数组上操作 生成新数组 filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。 *

  • 数组-堆排序

    采用堆排序方式对数组进行排序 堆排序百科:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆...

网友评论

      本文标题:堆排序-生成新的数组

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