为什么我的冒泡排序代码总是显示重复的数字?

Why does My Bubble sort code always show me repeated numbers?

最近我尝试使用 JavaScript 测试我自己的冒泡排序代码,但问题是每次我 运行 它的输出仍然显示相同的结果。它重复打印数组中的最后一个索引。谁能帮帮我,我还是个新手。

顺便说一句,这是代码。

var num = [31,23,55,2,13,90];
var bilnum = num.length,i ,j;
var temp = num[0];

for(i = 0;i < bilnum; i++){
    for(j = 0 ;j < bilnum - i; j++){
        if(num[j] < num[j+1]){
            num[j] = temp;
            num[j] = num[j+1];
            temp = num[j];
            
        }
    }
}

document.write(num)

你的问题在这里:

for(i = 0;i < bilnum; i++){
  for(j = 0 ;j < bilnum - i; j++){
      if(num[j] < num[j+1]){
          num[j] = temp;
          num[j] = num[j+1];
          temp = num[j];
      }
  }
}

切换时,谁先临时?这是您的第一个值(temp = num[0] 开头)。然后它获取第一次交换的值等等,弄乱你的数组并输出意外的结果。

切换两个元素时,顺序是这样的:

temp = num[j] -> 保持当前值

num[j] = num[j + 1] -> 与下一个值交换

num[j + 1] = temp -> 将之前的值放在新位置

此外,您的 if 条件将按 降序 顺序对您的数组进行排序。采用: if (arr[j] > arr[j + 1]) 递增 顺序排序

您的最终代码应如下所示:

var num = [31,23,55,2,13,90];
var bilnum = num.length,i ,j;
var temp;

for(i = 0;i < bilnum; i++){
    for(j = 0 ;j < bilnum - i; j++){
        if(num[j] > num[j+1]){
            num[j] = temp;
            num[j] = num[j+1];
            temp = num[j];
        
        }
    }
 }

 document.write(num)

这是因为,您正在为同一个分配num[j] = temp;。因此,它将向您显示数组中的最后一个值。

应该是:

var num = [31,23,55,2,13,90];
    var bilnum = num.length,i ,j;
    var temp = num[0];
    
    for(i = 0;i < bilnum; i++){
        for(j = 0 ;j < bilnum - i; j++){
            if(num[j] < num[j+1]){
              temp = num[j];            
              num[j] = num[j+1]; // first item
              num[j+1] = temp; // second item
            }
        }
    }
    console.log(num)

另一种手动排序数组的方法,仅供娱乐

// Manual sort function
const sort = ([...arr], type = 'asc', res = []) => {
  // Loop while array has values
  while(arr.length > 0) {
    // Define max and index variables
    let max = '', index = 0;
    // Loop existing values and find max value and
    // it's index.
    for(let i = 0; i < arr.length; i++) if(arr[i] > max) max = arr[i], index = i;
    // Cut max value from array and push it to the results
    res.push(arr.splice(index, 1)[0]);
  }
  // If you need ascending sort - revers results manually
  if(type === 'asc') res = ((a) => [...a].map(a.pop, a))(res);
  // Return result
  return res;
}

//
// Set and test
//

// Set test array of numbers
const num = [31,23,55,2,13,90];

// Test manual sort function
console.log(...sort(num, 'asc'));
console.log(...sort(num, 'desc'));

// Set test array of strings
const str = ['alpha', 'zetta', 'betta', 'xray', 'gamma', 'comma'];

// Test manual sort function
console.log(...sort(str, 'asc'));
console.log(...sort(str, 'desc'));

您的问题从第二个 for 循环开始:

for(j = 0 ;j < bilnum - i; j++){ 

为什么?

减号 i 将说明这样一个事实,即在您第一次对数组进行完整迭代后,最右边的元素将位于正确的位置,但您忘记了 - 1像这样:

for(j = 0 ;j < bilnum - i - 1; j++){

你的第二个错误在这里:

if(num[j] < num[j+1]){

应该是:

if(num[j] > num[j+1]){

为什么?

这是我们现在进行比较和交换逻辑的部分。请记住,您正在比较两个数字对。

所以你要查看元素 j 和它旁边的元素 j + 1.

您将查看元素 j 是否更大,如果是,您将交换这两个元素。

所以这就是比较每对的左侧和右侧的内容。

如果左侧较大,则需要对这两个元素进行交换。

因此你的第二个错误在这里:

num[j] = temp;

应该是:

temp = num[j];

所以你最后的错误是最后一行:

temp = num[j];

你成功的拿了右手边扔到左边,但是你没有拿左手边扔到右边,你想要这样:

 num[j + 1] = temp;

我觉得以后能帮到你的是因为temp起名不好,重命名为leftHand.

这更明显地表明这是对每对左侧元素的引用。