javascript - 递归选择排序(JS)

标签 javascript algorithm sorting recursion

我正在用 JavaScript 编写递归选择排序。

预期行为:我希望函数 selectionSort() 以升序对数组中的值进行排序。

问题:我无法退出递归,我也不知道该怎么做。

错误:

Uncaught RangeError: Maximum call stack size exceeded


这是我的代码:

const findSmallestIndex = ( arr ) => {
    let smallest = arr[0];
    let smallestIndex = 0;
    let arrLen = arr.length;

    for ( let i = 0; i < arrLen; i++ ) {
        if ( arr[i] < smallest ) {
            smallest = arr[i];
            smallestIndex = i;
        }
    }
    return smallestIndex;
};

const selectionSort = ( arr ) => {
    let smallest = arr.splice( findSmallestIndex( arr ), 1 );
    return [smallest].concat( selectionSort( arr ) );
};

let arr = [23, 43, 23423, 66, 5, 57, 78, 0, 1];

console.log( selectionSort(arr) );

最佳答案

  1. 您必须添加完成递归的条件(所谓的基本情况) if ( !arr.length ) return []
  2. arr.splice( findSmallestIndex( arr ), 1 ) 返回 Array 并且不需要 [smallest]... - 只需 smallest.concat( selectionSort ( arr ) )
  3. 改进:您的代码改变了 arr(由 ftor 指出)因此我们可以通过添加 let newArray = Array.prototype.slice.call 来修复它( arr );

/**
 * Finds smallest element of an aray
 * @param {Array} arr array for searching
 * @return {number} index of the smallest element in array
 */
const findSmallestIndex = ( arr ) => {
    let smallest = arr[0];
    let smallestIndex = 0;
    let arrLen = arr.length;

    for ( let i = 0; i < arrLen; i++ ) {
        if ( arr[i] < smallest ) {
            smallest = arr[i];
            smallestIndex = i;
        }
    }
    return smallestIndex;
};

/**
 * Sorts recursively an array of numbers
 * @param {Array} arr An array of numbers
 * @return {Array} New sorted array
 */
const selectionSort = ( arr ) => {
    if ( !arr.length ) return [];
    let newArray = Array.prototype.slice.call( arr );
    let smallest = arr.splice( findSmallestIndex( arr ), 1 );
    return smallest.concat( selectionSort( arr ) );
};

let arr = [23, 43, 23423, 66, 5, 57, 78, 0, 1];

console.log( selectionSort(arr) );

精选链接和条款:

  1. Mastering recursive programming
  2. Array.prototype.splice()
  3. Base case - 可以非递归地陈述解决方案的情况
  4. General (recursive) case - 根据自身的较小版本表达解决方案的案例

关于javascript - 递归选择排序(JS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49872634/

相关文章:

c# - 如何在用户单击列标题时启用 DataGridView 排序?

javascript - 如何禁用过多的 actions-on-google 日志 - api.ai

javascript - 动态生成的按钮,名称为 ='answer' 的表单控件无效

algorithm - 该算法的空间复杂度是多少(n 或 log(n))?

连接矩形边的算法

c - C中带指针的冒泡排序单链表

sorting - Elasticsearch 中的耦合

javascript - 如何用另一个数组过滤一个数组

javascript - 悬停时更改 div 内的图片(带边框)

java - 部分有序比较器到全序比较器