开发者问题收集

递归选择排序(JS)

2018-04-17
1216

我正在用 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) );
3个回答
  1. 您必须添加递归完成的条件(所谓的 基本情况 if ( !arr.length ) return []
  2. arr.splice( findSmallestIndex( arr ), 1 ) 返回 Array,并且不需要 [smallest]... - 只需 smallest.concat( choiceSort( 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. 掌握递归编程
  2. Array.prototype.splice()
  3. 基本案例 -解决方案可以非递归地陈述的情况
  4. 一般(递归)情况 - 解决方案以其自身的较小版本表达的情况
Kas Elvirov
2018-04-17

这里有更高效的方法。

function selectionSort(arr) {

    var swap = function(x, y) {
        var temp = arr[y];
        arr[y] = arr[x];
        arr[x] = temp;
    }

    var sort = function(start) {
        if (start === arr.length) {
            return arr;
        }

        var min = start;

        for (var i = start + 1; i < arr.length; i++) {
            if (arr[i] < arr[min]) {
                min = i;
            }
        }

        swap(start, min);

        return sort(start + 1);
    }

    return sort(0);
}

selectionSort([23, 43, 23423, 66, 5, 57, 78, 0, 1]);
the_haystacker
2020-05-25
function selectionSort(arr, min){

if(min == arr.length) return arr; 

var temp = arr[min]; 

var low = arr[min] ; 
var lowIdx ; 

for(let i = min + 1 ; i < arr.length ; i++){
        
    if(arr[i] < low){
        low = arr[i] ;  
        lowIdx = i ; 
    }
}

//if there is no elem lesser than 'low' then 'lowIdx' will be undefined
//i.e. array is sorted 
if(lowIdx == undefined ) return arr; 

arr[min] = low ; 
arr[lowIdx] = temp; 

return selectionSort(arr, min+1); 
}
Parikshit Sarkar
2023-01-26