javascript中的气泡排序-递归版本不起作用

时间:2019-08-24 12:12:18

标签: javascript recursion bubble-sort

我试图建立冒泡排序算法来对数组进行排序。它可以对数组进行排序,但是对于它的递归实现,它永远不会停止……我知道我应该放置一些break子句来停止for循环的执行,但是我不确定在哪里。

能否请您提供一些有关递归函数这类问题的有用指导?

谢谢

input = [1, 7, 5, 6, 8, 9, 9, 100, 24, 35, 10]

function bubbleSort(input) {
  for (let i = 0; i < input.length; i++) {
    if (input[i] > input[i + 1]) {
      let newvar = input[i];
      input[i] = input[i + 1];
      input[i + 1] = newvar;
      bubbleSort(input);
    }
  }
};
console.log(bubbleSort(input));

5 个答案:

答案 0 :(得分:1)

这是仅使用递归的版本- for循环-

const bubbleSort = (a = []) =>
  a.length < 2
    ? a
    : cont (singlePass (a))
        ( r =>
            [ ...bubbleSort (r .slice (0, -1))
            , ...r .slice (-1)
            ]
        )

const cont = x =>
  k => k (x)
  
const None =
  Symbol ()

const singlePass = ([ x = None, y = None, ...more ]) =>
  y === None
    ? [ x ]
: x === None
    ? []
: x > y
    ? [ y, ...singlePass ([ x, ...more ]) ]
    : [ x, ...singlePass ([ y, ...more ]) ]

const input =
  [ 1, 7, 5, 6, 8, 9, 9, 100, 24, 35, 10 ]

console .log (bubbleSort(input))
// [ 1, 5, 6, 7, 8, 9, 9, 10, 24, 35, 100 ]

如果将其打包为模块,则仅应导出bubbleSort-

module.exports = { bubbleSort }

答案 1 :(得分:0)

这是您代码的固定版本:

input = [1,7,5,6,8,9,9,100,24,35,10]

function bubbleSort(input, n) {
  if(n === 1) {return input;} // return when all the iterations are done
  for (let i = 0; i < input.length; i++) { 
    if(input[i] > input [i+1]){
    let newvar = input[i];
    input[i] = input[i+1];    
    input[i+1] = newvar;
    
    } 
  }
	return bubbleSort(input, n - 1); // Keep it outside for loop and return it to make it recursively returned
};
console.log(bubbleSort(input, input.length - 1));

答案 2 :(得分:0)

input = [1, 7, 5, 6, 8, 9, 9, 100, 24, 35, 10];


function bubbleSort(input) {
  for (let i = 0; i < input.length; i++) {
    if (input[i] > input[i + 1]) {
      let newvar = input[i];
      input[i] = input[i + 1];
      input[i + 1] = newvar;
      bubbleSort(input);
    }
    //return it reaches last loop of statement
    ***if(i == input.length -1){
      return input;
    }***
  }
};
console.log(bubbleSort(input));

答案 3 :(得分:0)

您必须使用计数器变量来计算当前迭代并在计数器等于数组长度时返回数组

Pad

答案 4 :(得分:0)

这是一种无循环无变量的解决方案来计算您已完成的迭代次数:

const bubbleSort = (a, length) => {
    if (length === 0) {
        return a;
    }
    if (length === undefined) {
        length = a.length;
    }
    return bubbleSort(a.sort((valueA, valueB) => valueA - valueB), length - 1);
};

要使用它,您只需传递需要排序的数组:

const testArr = [50, 5, 0, 10, -1];
console.log(bubbleSort(testArr)); //  [ -1, 0, 5, 10, 50 ]

我不知道它是否可以比这更短但仍然可读。