美文网首页
堆排序(dart实现)

堆排序(dart实现)

作者: 锦鲤跃龙 | 来源:发表于2020-11-06 23:47 被阅读0次

堆排序

[toc]

堆排序是选择排序的一种优化

1.执行流程

  1. 对序列进行原地建堆
  2. 重复执行下面的操作,直到对的元素数量为1
    1. 交换对顶元素与尾元素
    2. 堆的元素数量减1
    3. 对0位置进行一次下滤操作

2.代码

import 'sort.dart';

class HeapSort extends Sort {
 HeapSort(List<int> list ) : super( list); 
  int _heapSize;
  @override
  sort() {
    //原地建堆
    _heapSize = list.length;
    for (int i = (_heapSize >> 1) - 1; i >= 0; i--) {
      _siftDown(i);
    }

    //取出
    while (_heapSize > 1) {
      //交换对顶元素和尾部元素交换
      swap(0, _heapSize - 1);
      //堆的元素数量减1
      _heapSize -= 1;
      //对0位置进行一次下滤操作(恢复堆的性质)
      _siftDown(0);
    }
  }

  _siftDown(int index) {
    int element = list[index];
        int half = _heapSize >> 1;
    // 第一个叶子节点的索引 == 非叶子节点的数量
        // index < 第一个叶子节点的索引
        // 必须保证index位置是非叶子节点
        while (index < half) { // index必须是非叶子节点
        // index的节点有2种情况
            // 1.只有左子节点
            // 2.同时有左右子节点

            // 默认是左边跟父节点比
            int childIndex = (index << 1) + 1;
            int child = list[childIndex];
                // 右子节点
            int rightIndex = childIndex + 1;
            // // 选出左右子节点最大的那个  右子节点比左子节点大
            if (rightIndex < _heapSize && 
                    cmpElement (list[rightIndex], child) > 0) { 
        childIndex = rightIndex;
                child = list[rightIndex];
            }
            // 大于等于子节点
            if (cmpElement(element, child) >= 0) break;
            // 将子节点存放到index位置
            list[index] = child;
        // 重新设置index
            index = childIndex;
        }
        list[index] = element;
  }
}

3.校验

main(List<String> args) {
  List<int> list = IntergerTools.random(10, 1, 20);//生成随机数
  // List<int> list = IntergerTools.ascOrder(1, 1000);//有序
  // List<int> list = IntergerTools.tailAscOrder(1, 10000, 2000); //尾部有序
  List<int> list2 = List.from(list);
  List<int> list3 = List.from(list);
  // print(list);
  // print(list2);
  print("排序前:$list");
 

TimesTools.test('堆排序', () {
  HeapSort heapSort = HeapSort(list)..sortPrint();
  print("排序后:${heapSort.list}");

});

执行结果

排序前:[3, 11, 13, 15, 6, 13, 18, 9, 12, 1]
【堆排序】
开始:2020-11-01 13:36:03.273879
排序后:[1, 3, 6, 9, 11, 12, 13, 13, 15, 18]
结束 2020-11-01 13:36:03.281046
耗时:0.002 秒
-------------------------------------

总结

  • 最好、最坏、平均时间复杂度都是 O(nlogn),空间复杂度:O(1),属于不稳定排序

相关文章

  • 堆排序(dart实现)

    堆排序 [toc] 堆排序是选择排序的一种优化 1.执行流程 对序列进行原地建堆 重复执行下面的操作,直到对的元素...

  • JS实现堆排序

    原理 堆排序原理 实现 说明 堆排序对大文件很有效 堆排序是不稳定排序

  • 堆排序---基础篇

    本文主要介绍堆排序的一些基本过程和分析。 大纲 堆排序简介 堆排序代码实现 1. 堆排序简介 1.1 堆排序的存储...

  • 堆排序

    目录 1.堆排序介绍 2.堆排序图文说明 3.堆排序的时间复杂度和稳定性 4.堆排序实现 堆排序介绍 堆排序(He...

  • 堆排序的实现

    用大顶堆实现堆排序

  • 堆排序(非递归版)

    时间复杂度是O(nlogN) 但是不常用堆排序,因为堆排序不稳定 Java实现

  • 14.排序算法(5)

    1.堆排序介绍 2. 代码实现

  • python实现堆排序(HeapSort)

    python实现【堆排序】(HeapSort) 算法原理及介绍 堆排序(Heapsort)是指利用堆这种数据结构所...

  • 2021-11-17 dart模版解析mustache

    dart实现:https://github.com/valotas/mustache4dart[https://g...

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

网友评论

      本文标题:堆排序(dart实现)

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