我正在学习选择排序。对于某些值,我得到正确的输出,但是对于所有值,我却没有得到正确的输出,不知道为什么?
请参见下面的代码段:
function selectionSortRecursion(arr,p){
if( arr.length === 1){
return p;
}
min=arr[0];
for(var i =0;i<arr.length;i++){
if (arr[i]<min){
min = arr[i];
var minIdx=i;
}
}
temp=arr[0];
arr[0]=arr[minIdx];
arr[minIdx]=temp;
p.push(arr.shift());
return selectionSortRecursion(arr,p);
}
console.log(selectionSortRecursion([2,3,5,-3,20,0,2,6,-23],[]));
问题是,除非执行循环内的minIdx
语句的主体,否则不会声明变量if
。如果最小元素位于索引0,则arr[i] < min
从不为真,minIdx
未定义。
要解决这个问题,请在循环前写var minIdx = 0;
,因为min
被初始化为索引0处的值。另外两个变量也应该用var
声明:
function selectionSortRecursion(arr, p) {
if(arr.length === 0) {
return p;
}
var min = arr[0];
var minIdx = 0;
for(var i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
minIdx = i;
}
}
var temp = arr[0];
arr[0] = arr[minIdx];
arr[minIdx] = temp;
p.push(arr.shift());
return selectionSortRecursion(arr, p);
}
注意,我也将循环变量i
更改为从1开始,因为不需要将索引0与自身进行比较;并且递归的基本情况应该是arr.length
为0而不是1时,以避免丢失最后一个元素。
问题是,循环之前您没有initialize
与minIdx
一起使用,因为如果最小元素位于索引0,则将永远不会达到0
条件。
此外,当达到if (arr[i] < min) {
条件时,最后一个元素应使用arr.length === 1
方法。
push