JavaScript中的数字排序代码出错

问题描述 投票:0回答:4

以下代码应将字符串转换为数字数组,并按降序对其进行排序。目的是找到sort()方法的替代品。

出了点问题。如果将7放在数组的前半部分(如示例中所示),则代码无法正常工作。如果您将7替换为大于最后一个的数字(示例中为22),则代码将正常工作。

无论数字的位置如何,我都希望让它正常工作。

var row = '92 43 7 119 51 22';
var row = row.split(' ');
var column = row.map(Number);
function arrangeNum(column) {
    for (var i = 0; i <= column.length - 1; i++) {
        for (var j = column.length - i; j >= 0; j--) {
            if (column[j] > column[j - 1]) {
                var temp = column[j];
                column[j] = column[j - 1];
                column[j - 1] = temp;
            }
        }
    }
    return column;
}

console.log(arrangeNum(column));
javascript arrays sorting
4个回答
1
投票

出了点问题。如果将7放在数组的前半部分(如示例中所示),则代码无法正常工作。

这是因为你的第二次循环初始化j

更换

for (var j = column.length - i; j >= 0; j--) {

for (var j = column.length - 1; j >= i; j--) { 

请注意,j初始化为column.length - 1,但只允许低至i

演示

function arrangeNum(column) {
  for (var i = 0; i <= column.length - 1; i++) {
    for (var j = column.length - 1; j >= i; j--) {
      if (column[j] > column[j - 1]) {
        [column[j], column[j - 1]] = [column[j - 1], column[j]];
      }
    }
  }
  return column;
}

console.log( arrangeNum( '92 43 7 119 51 22'.split( /\s+/ ).map( Number ) ) );

1
投票

您遇到的问题是您实现了冒泡错误。

看到这行var j = column.length - i; j >= 0; j--,会让你忽略从右侧开始的数组元素。由于这是一个降序算法,你需要忽略左侧的元素,所以这个:var j = column.length - 1; j >= i; j--

我添加了一些控制台日志以显示如下:enter image description here

看到黄色你的算法忽略了下一个循环中的第一个元素。

下面我添加了完整的更正(你还有其他一些小问题):

for (var i = 1; i <= column.length; i++) {
        for (var j = column.length - i; j >= 0; j--) {
            console.log({i,j}, column.map((v,idx) => (idx===j) || (idx===j-1) ? `[${v}]` : v ).join(' '))
            if (column[j] > column[j - 1]) {
                var temp = column[j];
                column[j] = column[j - 1];
                column[j - 1] = temp;
                console.log({i,j}, '  ',column.map((v,idx) => (idx===j) || (idx===j-1) ? `[[${v}]]` : v ).join(' '))
            }
        }
    }

0
投票

在这里,你只需要扭转j循环的执行顺序,从0开始直到column.length - 1

var row = '92 43 7 119 51 22';
var row  = row.split(' ')
 var column = row.map(Number);
function arrangeNum(column) {
  for (var i = 0; i <= column.length - 1; i++) {
    for (var j = 0; j <= column.length - i; j++) { // SEE THIS
      console.log(column)
       if (column[j] > column[j - 1]) {
       var temp = column[j];
       column[j] = column[j - 1];
       column[j - 1] = temp;
    }
  }
}

return column;
}

console.log(arrangeNum(column))

0
投票

请在下面的代码中进行更改。它会工作

 var row = '92 43 7 119 51 22';
 var row = row.split(' ');
 var column = row.map(Number);
 function arrangeNum(column) {
  for (var i = 0; i <= column.length - 1; i++) {
    for (var j = column.length - 1; j >= i; j--) {// see this change
        if (column[j] > column[j - 1]) {
          var temp = column[j];
          column[j] = column[j - 1];
          column[j - 1] = temp;
        }
     }
  }
   return column;
}

console.log(arrangeNum(column));
© www.soinside.com 2019 - 2024. All rights reserved.