JavaScript

时间:2017-11-04 21:45:53

标签: javascript algorithm sorting

我正在用JavaScript编写插入排序算法。

但我有一个小错误,如下:



function insertionSort(arrayOfNumbers) {
  var j, key, i, length

  for (j = 1, length = arrayOfNumbers.length; j < length; j++) {
    key = arrayOfNumbers[j]
    i = j - 1
    while (i >= 0 && arrayOfNumbers[i] > key) {
      arrayOfNumbers[i + 1] = arrayOfNumbers[i];
      i = i - 1
    }
    arrayOfNumbers[i + 1] = key
  }

  return arrayOfNumbers
}

alert(insertionSort([2, 1, 5, 8, 9]))
&#13;
&#13;
&#13;

我已经编写了算法的伪代码版本,如下所示:

for j <- 2 to n

  do key <- A[ j ]

    i <- j - 1

    while i > 0 and A[ i ] > key

      do A[ i + 1 ] <- A[ i ]

        i <- i - 1

      A[ i + 1 ] <- key

你能发现我的错误吗?

2 个答案:

答案 0 :(得分:2)

do .. while不等同于伪代码 WHILE .. DO .. 。您还需要将算法调整为基于零的索引(您这样做了,但只是部分索引)。

见修复:

&#13;
&#13;
function insertionSort(arrayOfNumbers) {
  var j, key, i, length

  for (j = 1, length = arrayOfNumbers.length; j < length; j++) {
    key = arrayOfNumbers[j]
    i = j - 1
    while (i >= 0 && arrayOfNumbers[i] > key){
      arrayOfNumbers[i + 1] = arrayOfNumbers[i];
      i = i - 1
    } 
    arrayOfNumbers[i + 1] = key
  }

  return arrayOfNumbers
}

var result = insertionSort([2, 1, 5, 8, 9]);
console.log(result);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

问题是你无条件地将2转移到数组的末尾。

key = arrayOfNumbers[j]
i = j - 1
do {
  arrayOfNumbers[i + 1] = arrayOfNumbers[i];
  i = i - 1
} while (i > 0 && arrayOfNumbers[i] > key)
arrayOfNumbers[i + 1] = key

从元素1(为1)开始,i设置为0。 然后无条件地将元素0移到元素1并将键(旧元素1)插入元素0。

在下一次迭代中,您无条件地将元素1(现在是2)移位到元素2,依此类推。