Javascript:冒泡排序

时间:2016-06-14 16:19:52

标签: javascript algorithm sorting bubble-sort

我使用JS制作了冒泡排序算法(sorta)。它有时会工作,但问题是它只迭代数组一次。这是我的代码:

function bubble(arr) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] > arr[i + 1]) {
      var a = arr[i]
      var b = arr[i + 1]
      arr[i] = b
      arr[i + 1] = a
    }
  }
  return arr;
}

14 个答案:

答案 0 :(得分:1)

您需要一个内部循环才能正确完成排序:

function bubble(arr) {
      var len = arr.length;
    
      for (var i = 0; i < len ; i++) {
        for(var j = 0 ; j < len - i - 1; j++){ // this was missing
        if (arr[j] > arr[j + 1]) {
          // swap
          var temp = arr[j];
          arr[j] = arr[j+1];
          arr[j + 1] = temp;
        }
       }
      }
      return arr;
    }

document.write(bubble([1,9,2,3,7,6,4,5,5]));

答案 1 :(得分:1)

请查看以下序列:

[5, 4, 3, 2, 1]

现在假设您需要使用冒泡排序按升序排序。

因此,您迭代数组并交换其他命令的相邻元素。

以下是迭代完成后您将获得的内容

[4, 3, 2, 1, 5]

现在,如果你再次这样做,你会得到这个:

[3, 2, 1, 4, 5]

同样,您需要重复迭代足够的时间才能完全排序。这意味着您需要2个嵌套循环。内循环是迭代数组,外循环是重复迭代。

请参阅this文章的分步示例。

答案 2 :(得分:1)

var array = [6,2,3,7,5,4,1];
function bubbleSort(arr) {
    for(let j=0;j<arr.length;j++) {
        for(let i = 0; i < arr.length; i++) {
            if(arr[i]>arr[i+1]) {
                var temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
    }      
    return arr;
}
console.log(bubbleSort(array));

答案 3 :(得分:0)

我的冒泡只用了一个循环:

function bubbleSort(arr){
  var sorted = false
  while (!sorted){
    sorted = true;
    arr.forEach(function (element, index, array){
      if (element > array[index+1]) {
        array[index] = array[index+1];
        array[index+1] = element;
        sorted = false;
      }
    });
  }
}

答案 4 :(得分:0)

function bubble(arr) {//You need Two Loops for Bubble sort
  for (var i = 0; i < arr.length; i++) {//Outer Loop
   for(var j=0; j < arr.length - 1; j++){//Inner Loop
    if (arr[j] > arr[j + 1]) {
      var a = arr[j]
      var b = arr[j + 1]
      arr[j] = b
      arr[j + 1] = a
     }
   }
  }
  return arr;
}

答案 5 :(得分:0)

另一种形式的冒泡排序包括从数组的末尾开始并将最小的元素放在第一个并且直到最大的元素。这是代码:

function bubbleSort(items) {  
    var length = items.length;
    for (var i = (length - 1); i >= 0; i--) {
        //Number of passes
        for (var j = (length - i); j > 0; j--) {
            //Compare the adjacent positions
            if (items[j] < items[j - 1]) {
                //Swap the numbers
                var tmp = items[j];
                items[j] = items[j - 1];
                items[j - 1] = tmp;
            }
        }
    }
}

注意冒泡排序是最慢的排序算法之一。

答案 6 :(得分:0)

const bubbleSort = (array)=>{
  let sorted = false;

  let counter =0;

  while(!sorted){
    sorted = true;  
    for(let i =0; i < array.length -1 -counter; i++){

      if(array[i] > array[i+1]){
        helper(i,i+1,array);        
        sorted = false;
      }
    } 
    counter++;
  }
  return array;

}

//swap function
function helper(i,j, array){
  return [array[i],array[j]] = [array[j],array[i]]
}

let array=[8,5,2,9,5,6,3];

console.log(bubbleSort(array))

答案 7 :(得分:0)

对我有用。我对代码进行了注释,以进一步理解

bubbleSort = (numbersArray) => {
  const arrayLenght = numbersArray.length;

  for (let i = 0; i < arrayLenght; i++) {
    for(let j = 0; j < arrayLenght; j++) {
      // Print only to debug
      // console.log(`i: ${i} - j: ${j}`);
      // console.log(`numbersArray[i]: ${numbersArray[i]} | numbersArray[j]: ${numbersArray[j]}`);
    
      // Check if current number is greater than the next number
      if (numbersArray[j] > numbersArray[j + 1]) {
        // Store current value to generate swap
        const currentNumber = numbersArray[j];

        // Now the current position get value of the next position
        // And de next position get value of the current position
        numbersArray[j] = numbersArray[j + 1];
        numbersArray[j + 1] = currentNumber; 
      } 
    }
  }

  // Debug: Print the sorted array
  console.log(`sorted array: ${numbersArray.toString()}`);
}

const numbers = [
  [3, 10, 5, 7],
  [8, 5, 2, 9, 5, 6, 3],
  [4, 50, 28, 47, 9, 2097, 30, 41, 11, 3, 68],
  [3, 10, 5, 7, 8, 5, 2, 9, 5, 6, 3]
];

numbers.forEach(element => {
  bubbleSort(element);
});

输出:

  • 排序数组:3、5、7、10
  • 排序数组:2,3,5,5,6,8,9
  • 排序数组:3,4,9,11,28,30,41,47,50,68,2097
  • 排序数组:2,3,3,5,5,5,6,7,8,9,10

答案 8 :(得分:0)

package hasan;

public class hssd {

public static void main(String[] args) {


 int t=9;
int g=20;



 for (t=g;t>19;++t){

    System.out.println(7);
   int f=12;
   int r=15;

    for(r=f;r>5;++r)
        System.out.println(r+1000000000+"*"+1000000000);
    }
}

}

答案 9 :(得分:0)

var arr = [5, 3, 4, 1, 2, 6];

function sort (arr) {
    for(let i=0; i < arr.length - 1; i++) {
        if(arr[i] > arr[i+1]) {
            let b = arr[i+1];

            arr[i+1] = arr[i];
            arr[i] = b;

            i = -1; // Resets the loop
        }
    }

    return arr;
}

console.log(sort(arr));

答案 10 :(得分:0)

试试这个(性能升级):

function bubbleSort(inputArr, reverse = false) {
    const len = inputArr.length;
    for (let i = 0; i < len; i++) {
        for (let j = i + 1; j < len; j++) {
            let a = inputArr[i];
            let b = inputArr[j];
            if (reverse ? a < b : a > b) {
                const tmp = inputArr[j];
                inputArr[j] = inputArr[i];
                inputArr[i] = tmp;
            }
        }
    }
    return inputArr;
}

使用:

arr = [234,2,4,100, 1,12,5,23,12];
console.log(bubbleSort(arr)); // or console.log(bubbleSort(arr, true));

答案 11 :(得分:0)

你需要另一个循环:

var arr = [2, 1]
for(let i = 0;i<arr.length;i++){
    for(let b = 0; b<arr.length;i++){
        if(arr[b] > arr[b+1]){
            var first = arr[b]
            var second = arr[b + 1]
            arr[b] = second
            arr[b + 1] = first
        }
    }
}

希望这会有所帮助,但如果您想要高效率,我建议您使用快速排序。

答案 12 :(得分:0)

另一个冒泡排序实现:

const bubbleSort = array => {
  const arr = Array.from(array); // avoid side effects
  for (let i = 1; i < arr.length; i++) {
    for (let j = 0; j < arr.length - i; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
};

答案 13 :(得分:0)

const bubbleSort = (inputArr) => {
  const len = inputArr.length;

  for (let i = 0; i < len; i++) {
    for (let j = 0; j < len; j++) {
      if (inputArr[j] > inputArr[j + 1]) {
        let tmp = inputArr[j];
        inputArr[j] = inputArr[j + 1];
        inputArr[j + 1] = tmp;
      }
    }
  }

  return inputArr;
};

const numbers = [50, 30, 10, 40, 60];

console.log(bubbleSort(numbers));

// Output: [ 10, 30, 40, 50, 60 ]