我是JavaScript的新手,正在尝试实现选择排序以使我对数组不感兴趣(请注意:我知道这里有一个内置的排序功能)。不过,我遇到了一些奇怪的行为。
这是我的代码:
function selectionSort(array)
{
let currentMin = 0;
var minIndex = 0;
function swap(array, i, j)
{
let temp = array[i];
array[i] = array[j];
array[j] = temp;
}
for(var i = 0; i < array.length - 1; i++)
{
console.log(array);
currentMin = array[i];
minIndex = i;
for(var j = i + 1; j < array.length; j++)
{
if(array[j] < currentMin)
{
currentMin = array[j];
minIndex = j;
}
}
if(minIndex != i)
{
swap(array, i, j);
}
}
console.log(array);
return array;
}
var myArray = [2, 50, 8, 4, 3, -400, 12, 120];
var sorted = selectionSort(myArray);
document.write('<p>Unsorted: ' + String(myArray) + '</p>');
document.write('<p>Sorted: ' + String(sorted) + '</p>');
结果:
这是一些日志的屏幕截图:
我做错了什么导致所有这些undefined
出现?
答案 0 :(得分:3)
问题在这里:
swap(array, i, j);
调用此命令时,j
为array.length
,因此array[j]
为undefined
,因为您不在数组末尾。
我想你的意思是
swap(array, i, minIndex);
// ------------^^^^^^^^
进行此更改,然后在对“未排序”行进行排序之前而不是之后对数组进行输出:
function selectionSort(array)
{
let currentMin = 0;
var minIndex = 0;
function swap(array, i, j)
{
let temp = array[i];
array[i] = array[j];
array[j] = temp;
}
for(var i = 0; i < array.length - 1; i++)
{
console.log(array);
currentMin = array[i];
minIndex = i;
for(var j = i + 1; j < array.length; j++)
{
if(array[j] < currentMin)
{
currentMin = array[j];
minIndex = j;
}
}
if(minIndex != i)
{
swap(array, i, minIndex);
}
}
console.log(array);
return array;
}
var myArray = [2, 50, 8, 4, 3, -400, 12, 120];
document.write('<p>Unsorted: ' + String(myArray) + '</p>');
selectionSort(myArray);
document.write('<p>Sorted: ' + String(myArray) + '</p>');
重要的是要了解selectionSort
是在数组就地上运行的,它不会创建新的数组。从您的原始代码来看,您似乎认为确实如此:
var myArray = [2, 50, 8, 4, 3, -400, 12, 120];
var sorted = selectionSort(myArray);
document.write('<p>Unsorted: ' + String(myArray) + '</p>');
document.write('<p>Sorted: ' + String(sorted) + '</p>');
sorted
和myArray
都指向同一个数组(sorted === myArray
是正确的),这就是为什么两行在之后 {{1 }},甚至使用“未排序”行。
如果您想返回一个 new 数组,则可以像这样在selectionSort
中复制该数组开始:
selectionSort
或者在现代环境中,array = array.slice();
。
但是,如果要创建一个新数组,则插入排序可能比这种排序算法更有效。 (还有其他用于就地排序的算法,对于大多数输入数据,大多数算法比此算法更有效。)