递归选择排序(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个回答
-
您必须添加递归完成的条件(所谓的
基本情况
)
if ( !arr.length ) return []
-
arr.splice( findSmallestIndex( arr ), 1 )
返回 Array,并且不需要[smallest]...
- 只需smallest.concat( choiceSort( arr ) )
-
改进
:您的代码改变了
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) );
精选链接和术语 :
- 掌握递归编程
- Array.prototype.splice()
- 基本案例 -解决方案可以非递归地陈述的情况
- 一般(递归)情况 - 解决方案以其自身的较小版本表达的情况
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