这种选择排序的实现有什么问题?
What's the problem with this implementation of selection sort?
我正在学习选择排序。
我得到了一些值的正确输出,但不是所有值,不知道为什么??
请查看以下代码片段:
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],[]));
问题是除非执行循环内的if
语句的主体,否则不会声明变量minIdx
。如果最小元素位于索引 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,以避免丢失最后一个元素。
我正在学习选择排序。 我得到了一些值的正确输出,但不是所有值,不知道为什么??
请查看以下代码片段:
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],[]));
问题是除非执行循环内的if
语句的主体,否则不会声明变量minIdx
。如果最小元素位于索引 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,以避免丢失最后一个元素。