以下代码应将字符串转换为数字数组,并按降序对其进行排序。目的是找到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));
出了点问题。如果将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 ) ) );
您遇到的问题是您实现了冒泡错误。
看到这行var j = column.length - i; j >= 0; j--
,会让你忽略从右侧开始的数组元素。由于这是一个降序算法,你需要忽略左侧的元素,所以这个:var j = column.length - 1; j >= i; j--
。
看到黄色你的算法忽略了下一个循环中的第一个元素。
下面我添加了完整的更正(你还有其他一些小问题):
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(' '))
}
}
}
在这里,你只需要扭转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))
请在下面的代码中进行更改。它会工作
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));