dart 桶排序

2020-11-18  本文已影响0人  锦鲤跃龙

桶排序

1.思路

  1. 创建一定数量的桶(比如用数组、链表作为桶)
  2. 按照一定的规则(不同类型的数据,规则不同),将序列中的元素均匀分配到对应的桶
  3. 分别对每个桶进行单独排序
  4. 将所有非空桶的元素合并成有序序列

1.1例子

原数组为[0.34,0.47,0.29,0.84,0.45,0.38,0.35,0.76]

这里是小数,所以元素在通用的索引可以:元素值*元素数量

桶号 内容
0
1
2 [0.34,0.29,0.35]
3 [0.47,0.45,0.38]
4
5
6 [0.84,0.76]
7
桶号 内容
0
1
2 [0.29,0.34,0.35]
3 [0.38,0.45,0.47]
4
5
6 [0.76,0.84]
7

1.2代码

class BucketSourt extends Sort<num>  {
  @override
  sort() {
    //创建桶
    List<List> buckets = List(list.length);
    for (var i = 0; i < list.length; i++) {
      int bucketIndex = (list[i]*list.length).floor();
      List<num> bucket = buckets[bucketIndex];
      if (bucket == null) {
        bucket = List();
        buckets[bucketIndex] = bucket;
      }
      bucket.add(list[i]);
    }
    //对每个桶进行排序
    int index = 0;
    for (var i = 0; i < buckets.length; i++) {
      if (buckets[i]==null) continue;
      buckets[i].sort();
      for (var item in buckets[i]) {
        list[index++] = item;
      }
    }
  }
  
}

实验


main(List<String> args) {
 BucketSourt bucketSourt =  BucketSourt();
 bucketSourt.list = [0.34,0.47,0.29,0.84,0.45,0.38,0.35,0.76];
 bucketSourt.sort();//这里复杂度 nlogn
 print(bucketSourt.list );
}

结果

[0.29, 0.34, 0.35, 0.38, 0.45, 0.47, 0.76, 0.84]

1.3 复杂度

空间复杂度:O(n + m),m 是桶的数量
时间复杂度:
O(n)+m*O(n/m*logn/m)
= O(n+n*logn/m)
= O(n+n*logn-n*longm)
约等于 O(n+k),k为 n*logn-n*longm

题外

跟哈希表的思想有点像

上一篇 下一篇

猜你喜欢

热点阅读