• js桶排序


    桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

    算法描述

    • 设置一个定量的数组当作空桶;
    • 遍历输入数据,并且把数据一个一个放到对应的桶里去;
    • 对每个不是空的桶进行排序;
    • 从不是空的桶里把排好序的数据拼接起来。 

    图片演示

    代码实现

    let array = randomArray(1,100);
    console.log(array);
    let sortArray = bucketSort(array, array.length);
    console.log(sortArray);
    function bucketSort(arr, bucketSize) {
      if (arr.length === 0) {
        return arr;
      }
      var i;
      var minValue = arr[0];
      var maxValue = arr[0];
      for (i = 1; i < arr.length; i++) {
        if (arr[i] < minValue) {
          minValue = arr[i]; // 输入数据的最小值
        } else if (arr[i] > maxValue) {
          maxValue = arr[i]; // 输入数据的最大值
        }
      }
      // 桶的初始化
      var DEFAULT_BUCKET_SIZE = 5; // 设置桶的默认数量为5
      bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
      var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;
      var buckets = new Array(bucketCount);
      for (i = 0; i < buckets.length; i++) {
        buckets[i] = [];
      }
      // 利用映射函数将数据分配到各个桶中
      for (i = 0; i < arr.length; i++) {
        buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);
      }
      arr.length = 0;
      for (i = 0; i < buckets.length; i++) {
        insertionSort(buckets[i]); // 对每个桶进行排序,这里使用了插入排序
        for (var j = 0; j < buckets[i].length; j++) {
          arr.push(buckets[i][j]);
        }
      }
      return arr;
    }
    function insertionSort(array) {
      for (let begin = 1;begin < array.length;begin++) {
        let cur = begin;
        let v = array[cur];
        while(cur > 0 && v < array[cur -1]){
          array[cur] = array[cur - 1];
          cur--;
        }
        array[cur] = v;
      }
      return array;
    }

    function randomArray(start,end){
      var a=[],o={},random,step=end-start;
      while(a.length<step){
        random=start+parseInt(Math.random()*step);
        if(!o["x"+random]){
          a.push(random);
          o["x"+random]=1;
        };
      };
      return a;
    };

    打印结果

    算法分析

    桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。 

  • 相关阅读:
    IIS/如何查看IIS上部署网站的实时连接数
    在文件系统中无法访问其他服务器共享的文件夹,如何解决
    SQL sever2008 r2 安装闪退的解决办法
    加密字符串传值时把+号过滤掉了的解决办法
    C# WinForm点击Radio判断是否选中,监控TextBox输入动作
    【转】Entity Framework 数据库初始化的三种方法
    Kubernetes RESTMapper源码分析
    Golang中下划线的使用
    测试开发该如何在团队中推广新工具、新技术(深度好文)
    Java 在Word指定段落/文本位置插入分页符 E
  • 原文地址:https://www.cnblogs.com/ming1025/p/13896519.html
Copyright © 2020-2023  润新知