美文网首页
nodejs实现字符串排序(高位优先&低位优先)

nodejs实现字符串排序(高位优先&低位优先)

作者: ape_caesar | 来源:发表于2019-01-18 14:15 被阅读0次

字符串排序

网上很多都是c实现的,这里我写一个nodejs实现的

低位优先字符串排序

const testArr = ['abc', 'abd', 'dbc', 'wdx', 'yex', 'nds', 'wed', 'dqs'];

lowFirstSort(testArr);
console.log(testArr)

function lowFirstSort(stringArray: string[]) {
    /**
     * 字符串数组长度
     */
    const arrLength = stringArray.length;
    /**
     * 字符表(a-z)长
     */
    const charLength = 26;
    /**
     * 排序的字符串数组的字符串长度
     */
    const wordLength = stringArray[0].length;
    /**
     * 辅助数组
     */
    const busArr = new Array<string>(arrLength)
    /**
     * 创建键索引计数数组
     */
    const assistenArr = new Array<number>(charLength + 1).fill(0);
    
    // 从低位开始
    for (let i = wordLength - 1; i >=0 ; i--) {
        /**
         * 开始键计数  如:数组第一个元素是'abc', 元素的最后一个字符是'c', 则
         * assistenArr数组的索引3的位置加一  ->   assistenArr[3]++
         * [ 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0 ]
         * [ 0, 0, a, b, c, d, e, f, g, h, i.... ]
         * 如上就说明有3个a,1个d....
         */
        for (let j = 0; j < arrLength; j++) {
            assistenArr[stringArray[j].charCodeAt(i) - 97 + 1]++
        }
        /**
         * 累计计数   如:[0, 1, 0, 0, 2, 1, 0]  -->  [0, 1, 1, 1, 3, 4, 4]
         * 把键计数转换为索引
         */
        for (let j = 0; j < charLength; j++) {
            assistenArr[j + 1] += assistenArr[j]
        }
        /**
         * 开始排序
         */
        for (let j = 0; j < arrLength; j++) {
            busArr[assistenArr[stringArray[j].charCodeAt(i) - 97]++] = stringArray[j];
        }
        /**
         * 复制回原数组stringArray
         */
        for (let j = 0; j < arrLength; j++) {
            stringArray[j] = busArr[j];
        }
        /**
         * 清空键索引计数数组, 留以下个循环使用
         */
        assistenArr.fill(0);
    }
}

高位优先字符串排序

const testArr2 = ['wdxsexg', 'yex', 'nadsas', 'waaeed', 'dqsf', 'abc', 'abcde', 'abcab'];

highFirstSort(testArr2);
console.log(testArr2)
function highFirstSort(stringArray: string[]) {
    /**
     * 字符串数组长度
     */
    const arrLength = stringArray.length;
    /**
     * 字符表(a-z)长
     */
    const charLength = 26;
    /**
     * 辅助数组
     */
    const busArr = new Array<string>(testArr2.length)
    /**
     * 递归开始
     */
    sort(stringArray, 0, arrLength-1, 0, busArr, charLength);
}
/**
 * 重写的charCodeAt方法
 * @param _string 字符串
 * @param position 位置
 */
function charCodeAtMy(_string: string, position: number) {
    return _string.length > position ? _string.charCodeAt(position) - 97 : -1;
}

function sort(array: string[], low: number, high: number, position: number, busArr: string[], charLength: number){
    if (low >= high) {
        return;
    }
    /**
     * 创建键索引计数数组
     */
    const assistenArr = new Array<number>(charLength + 2).fill(0);
    /**
     * 开始键计数
     * [ 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0 ]
     * [ 0, 0, a, b, c, d, e, f, g, h, i.... ]
     * 如上就说明有3个a,1个d....
     */
    for (let i = low; i <= high; i++) {
        assistenArr[charCodeAtMy(array[i], position) + 2]++;
    }
    /**
     * 累计计数   如:[0, 1, 0, 0, 2, 1, 0]  -->  [0, 1, 1, 1, 3, 4, 4]
     * 把键计数转换为索引
     */
    for (let j = 0; j < charLength + 1; j++) {
        assistenArr[j + 1] += assistenArr[j];
    }
    /**
     * 开始排序
     */
    for (let j = low; j <= high; j++) {
        busArr[assistenArr[charCodeAtMy(array[j], position) + 1]++] = array[j];
    }
    /**
     * 复制回原数组stringArray
     */
    for (let j = 0; j <= high-low; j++) {
        array[low + j] = busArr[j];
    }
    /**
     * 递归调用, 如: 'ac' 'ab'这样的高位相同的,在assistenArr数组中的体现就是
     * arr[n+1] - 1 > arr[n]: 这就说明这里存在着相同的字符, 有两个a
     * low + assistenArr[i] < low + assistenArr[i + 1] - 1 
     * 所以还要以第二个字符进行键索引计数排序
     */
    for (let i = 0; i < charLength - 1; i++) {
        sort(array, low + assistenArr[i], low + assistenArr[i + 1] - 1, position + 1, busArr, charLength)
    }
}

相关文章

  • nodejs实现字符串排序(高位优先&低位优先)

    字符串排序 网上很多都是c实现的,这里我写一个nodejs实现的 低位优先字符串排序 高位优先字符串排序

  • 《算法》笔记 13 - 字符串排序

    键索引计数法频率统计将频率转换为索引数据分类回写 低位优先的字符串排序 高位优先的字符串排序 许多重要而熟悉的问题...

  • 基数排序

    综述 基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位.有时候有些属性是有优先...

  • 10、基数排序(Radix Sort)

    基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序...

  • 字符串排序(二)

    高位优先的字符串排序要实现一个通用的字符串排序算法(字符串的长度不一定相同),我们应当考虑从左向右遍历所有字符。显...

  • 字符串排序:键索引计数法

    字符串排序有很多应用,比如车牌的排序,基因编码等。今天介绍一种低位优先的字符串排序算法,在介绍它之前先介绍另一种算...

  • 判断是大端还是小端方式

    高位优先(大端方式)的体系结构把最高字节位放在最小的内存地址上。这和低位优先形成了鲜明的对照 下面这段代码在用户空...

  • 堆排序学习总结

    本文摘抄总结于《算法》 我们可以把任意优先队列变成一种排序方法。而优先队列有多种实现方式,如无序数组实现的最小优先...

  • 13 基本排序算法:基数排序

    基数排序 原理 基数排序属于"低位优先”排序法,通过反复进行分配与收集操作完成排序。假设记录r[i]的关键字为ke...

  • 读书笔记:《佐藤可士和的超整理求》

    空间整理:设定优先排序 信息整理:导入观点 – 设定优先排序 思考整理:思绪信息化 – 导入观点 – 设定优先排序...

网友评论

      本文标题:nodejs实现字符串排序(高位优先&低位优先)

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