美文网首页
排序算法(十一)桶排序

排序算法(十一)桶排序

作者: ChooAcc | 来源:发表于2020-05-09 17:27 被阅读0次

排序算法(十一)桶排序

  桶排序(Bucket sort)计数排序改进版,同样属于非比较排序,该算法的基本思想为将数组分到有限数量的桶子里,再在各个桶里面分别排序,最后将所有桶里的数据依次取出,则为有序序列。

图片演示

桶排序

代码实现(TypeScript实现)

/**
 * 直接插入排序
 * @param arr 源数组
 */
function insertionSort(arr: Array<number>): Array<number> {
    let cur: number;    // 记录当前预转换位置的元素
    let j: number;  // 记录与预转换位置元素做比较的元素的下标,该值每循环一次改变一次

    for (let i = 0, len = arr.length; i < len; i++) {
        cur = arr[i];
        j = i - 1;
        while (j >= 0 && arr[j] > cur) {
            arr[j + 1] = arr[j];  // 移动元素
            j--;
        }
        arr[j + 1] = cur;   // 预转换的元素插入对应的位置
    }

    return arr;
}

/**
 * 桶排序
 * @param arr 源数组
 * @param bucketSize 每个桶的容量(默认 5)
 */
function bucketSort(arr: Array<number>, bucketSize: number = 5) {
    // 求范围
    let min = arr[0];
    let max = min;
    // 定义计数数组
    arr.forEach(element => {
        if (element < min) { min = element; }
        if (element > max) { max = element; }
    });
    // 初始化桶
    let bucketCount = (((max - min) / bucketSize) | 0) + 1;
    let buckets: number[][] = new Array<Array<number>>(bucketCount);
    for (let i = 0, len = buckets.length; i < len; i++) {
        buckets[i] = [];
    }
    // 数据印映射到桶中
    arr.forEach(element => {
        buckets[((element - min) / bucketSize) | 0].push(element)
    })
    // 对各个桶排序
    arr.length = 0;
    buckets.forEach(bucket => {
        insertionSort(bucket);
        bucket.forEach(element => {
            arr.push(element);
        });
    });
    return arr;
}


let originData: Array<number> = [5, 6, 7, 9, 10, 15, 13, 19, 5, 9, 13, 10];
console.log(bucketSort(originData, 2));

分析

  1. 算法的稳定性取决于对桶中元素排序时选择的排序算法。
  2. 桶排序与计数排序类似,计数排序只适用于元素值较为集中的情况。
  3. 桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。

相关文章

  • 排序算法(十一)桶排序

    排序算法(十一)桶排序   桶排序(Bucket sort)是计数排序改进版,同样属于非比较排序,该算法的基本思想...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 排序算法三(桶,计数,基数)

    桶排序,计数排序,基数排序算法的时间复杂度都是线性的,所以把这类排序算法叫作线性排序。 桶排序 概念:将要排序的数...

  • (转)排序算法

    排序算法点这里 数据结构与算法——计数排序、桶排序、基数排序

  • noip普及组3:排序算法

    排序算法 ①冒泡排序:O() ②插入排序:O() ③选择排序:O() ④桶排序 ⑤sort排序

  • 排序算法概述

    十大排序算法:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序、希尔排序、计数排序,基数排序,桶排序 算法...

  • 十大排序算法

    算法说明 十大排序算法分别是:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序...

  • 桶排序与哈希桶排序

    一.桶排序 算法原理 桶排序 (箱排序)的原理是将待排序序列分到有限数量的桶里面,然后对每个桶再分别排序(可以使用...

  • 线性排序

    一、线性排序算法介绍 线性排序算法包括桶排序、计数排序、基数排序。 线性排序算法的时间复杂度为O(n)。 此3种排...

网友评论

      本文标题:排序算法(十一)桶排序

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