首页 > 解决方案 > 如何在不使用 JavaScript 中的内置 sort() 和 atoi 方法的情况下对字符串数据类型的数组进行排序

问题描述

我正在尝试对下面给定的数组进行排序,而不将字符串转换为数字(没有 atoi 函数),也没有使用 sort() 内置函数

inputArr = ["1","2","10","3","21","15"]

let len = inputArr.length;
    for (let i = 0; i < len; i++) {
        for (let j = 0; j < len; j++) {
            if (inputArr[j] > inputArr[j + 1]) {
                let tmp = inputArr[j];
                inputArr[j] = inputArr[j + 1];
                inputArr[j + 1] = tmp;
            }
        }
    }
    return inputArr;

但是上面的代码没有按正确的顺序对数字进行排序

预期输出:["1","2","3",,"10","15","21"]

标签: javascriptarrayssorting

解决方案


您似乎正在通过使用 BubbleSort 来解决问题,因此尝试使用相同的算法提出解决方案。

问题在于你的比较。

你会看到

"1" < "10" === true

"2" < "10" === false

因此,您需要检查字符串的每个字符,以确定数字实际上是否更小。这是代码:

    const arr = ["1", "2", "10", "3", "21", "15"];
    const len = arr.length;

    const isGreater = (num1, num2) => {
        if (num1.length < num2.length) return false;
        for (let i = 0; i < len; ++i) {
           if(num1[i] === num2[i]) continue;
           return (num1[i] > num2[i]);
        }
        return false;
    }

    for (let i = 0; i < len; ++i) {
        for (let j = 0; j < len - i - 1; ++j) {
            if (arr[j].length > arr[j + 1].length || isGreater(arr[j], arr[j + 1])) {
                let tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }

    console.log(arr);

功能 isGreater 将为您进行检查。


推荐阅读