美文网首页
排序(2)

排序(2)

作者: weiee | 来源:发表于2020-05-17 14:16 被阅读0次

线性排序:Bucket sort,Counting sort,Radix sort

桶排序

  1. 数据能划分为m个桶,桶之间有天然有序;
  2. 数据在各个桶之间分布均匀;

计数排序

数据范围不大的非负整数排序

function countingSort(arr) {
    let min = arr[0], max = arr[0];
    arr.forEach((item) => {
        min = min < item ? min : item;
        max = max > item ? max : item;
    });
    let n = max - min + 1, countList = [];
    for (let i = 0; i < n; i++) {
        countList.push(0);
    }
    arr.forEach((item) => {
        countList[item - min]++;
    });
    let result = [];

    // 方法1: 累加,逆序求值
    for (let i = 1; i < n; i++) {
        countList[i] += countList[i-1];
    }
    for (let i = arr.length-1; i >= 0; i--) {
        let val = arr[i];
        let j = countList[val-min];
        result[j-1] = val;
        countList[val-min]--;
    }

    // 方法2: 递减取值
    // for (let i = 0; i < countList.length; i++) {
    //     while(countList[i] > 0) {
    //         result.push(i+min);
    //         countList[i]--;
    //     }
    // }
    return result;
}

基数排序

  1. 有独立分割的位,高低位有递进关系;
  2. 每位数据范围不可太大,要可以用线性排序。
    例:手机号码,低位到高位每位稳定排序,k位整数=k次桶排序or计数排序
function radixSort(arr) {
    let n = 0;
    arr.forEach(item => {
        let tmpLen = String(item).length;
        n = tmpLen > n ? tmpLen : n;
    });
    let bucket = [], result = [], max = n;
    while (n > 0) {
        n--;
        result = [];
        bucket = [];
        for (let i = 0; i <= 9; i++) {
            bucket[i] = [];
        }
        arr.forEach(item => {
            let val = String(item);
            let prefix = max - val.length;
            while(prefix > 0) {
                val = "0" + val;
                prefix--;
            }
            let key = val.charAt(n) || 0;
            bucket[key].push(item);
        });
        for (let i = 0; i <= 9; i++) {
            if (bucket[i].length > 0) {
                result = result.concat(bucket[i]);
            }
        }
        arr = result;
    }
    return result;
}

相关文章

  • android 随笔之排序算法

    1,冒泡排序(1) 冒泡排序(2) 2,选择排序 3,插入排序 4,快速排序

  • MySQL学习:DQL:查询语句

    1、排序查询 ORDER BY 排序字段1 排序方式1,排序字段2 排序方式2; 排序方式: ASC:升序,默认的...

  • [Haskell] 一些常见的排序算法

    1. 排序算法 (1)选择排序 (2)插入排序 (3)快速排序 (4)归并排序 (5)堆排序 (6)树排序 2. ...

  • python 八大算法

    排序算法总结 排序算法 平均时间复杂度 冒泡排序O(n2) 选择排序O(n2) 插入排序O(n2) 希尔排序O(n...

  • [算法导论]-第七章-快速排序

    本章重点 1.快速排序 2.冒泡排序 3.希尔排序 1.快速排序 2.冒泡排序 3.希尔排序 希尔排序,也称递减增...

  • js常用的数组排序

    1、冒泡排序 2、选择排序 3、桶排序 4、sort排序

  • 算法-排序算法总结

    排序类型总结 1 排序算法基础实现 2 排序算法应用 2.1 基础排序 2.2 计数排序应用 2.3 快排应用 2...

  • 排序算法小总结

    排序算法时间复杂度冒泡排序O(n2)选择排序O(n2)插入排序O(n2)希尔排序O(n1.5)快速排序O(N*lo...

  • 排序

    1、选择排序 2、冒泡排序 3、插入排序 4、快速排序

  • 排序算法

    1冒泡排序 2插入排序 3选择排序 4快速排序

网友评论

      本文标题:排序(2)

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