堆排序-生成新的数组

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

  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}");

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容