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

问题描述

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

这是代码

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)

解决方法

这是因为,您再次为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)

,

您的问题在这里:

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,90];
var bilnum = num.length,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)
,

另一种有趣的手动排序数组的方法

// 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,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++){

您的第二个bug在这里:

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

这显然是对每对左侧元素的引用。