问题描述
最近我尝试使用JavaScript测试我自己的Bubble Sort代码,但是问题是每次运行它时,输出仍然显示相同的结果。它重复打印数组中的最后一个索引。谁能帮我,我还是新手。
这是代码。
var num = [31,23,55,2,13,90];
var bilnum = num.length,i,j;
var temp = num[0];
for(i = 0;i < bilnum; i++){
for(j = 0 ;j < bilnum - i; j++){
if(num[j] < num[j+1]){
num[j] = temp;
num[j] = num[j+1];
temp = num[j];
}
}
}
document.write(num)
解决方法
这是因为,您再次为num[j] = temp;
和分配了相同的。因此,它将向您显示数组中的最后一个值。
应该是:
var num = [31,23,55,2,13,90];
var bilnum = num.length,i,j;
var temp = num[0];
for(i = 0;i < bilnum; i++){
for(j = 0 ;j < bilnum - i; j++){
if(num[j] < num[j+1]){
temp = num[j];
num[j] = num[j+1]; // first item
num[j+1] = temp; // second item
}
}
}
console.log(num)
,
您的问题在这里:
for(i = 0;i < bilnum; i++){
for(j = 0 ;j < bilnum - i; j++){
if(num[j] < num[j+1]){
num[j] = temp;
num[j] = num[j+1];
temp = num[j];
}
}
}
切换时,最初是谁?它是您的第一个值(开头是{temp = num[0]
)。然后,它将获取第一次交换的值,依此类推,弄乱了数组并输出了意外的结果。
切换两个元素时,顺序如下:
temp = num[j]
->保持当前值
num[j] = num[j + 1]
->与下一个值交换
num[j + 1] = temp
->将之前的值放在新位置
此外,您的if
条件将对数组进行降序排序。采用:
if (arr[j] > arr[j + 1])
以递增顺序
您的最终代码应如下所示:
var num = [31,90];
var bilnum = num.length,j;
var temp;
for(i = 0;i < bilnum; i++){
for(j = 0 ;j < bilnum - i; j++){
if(num[j] > num[j+1]){
num[j] = temp;
num[j] = num[j+1];
temp = num[j];
}
}
}
document.write(num)
,
另一种有趣的手动排序数组的方法
// Manual sort function
const sort = ([...arr],type = 'asc',res = []) => {
// Loop while array has values
while(arr.length > 0) {
// Define max and index variables
let max = '',index = 0;
// Loop existing values and find max value and
// it's index.
for(let i = 0; i < arr.length; i++) if(arr[i] > max) max = arr[i],index = i;
// Cut max value from array and push it to the results
res.push(arr.splice(index,1)[0]);
}
// If you need ascending sort - revers results manually
if(type === 'asc') res = ((a) => [...a].map(a.pop,a))(res);
// Return result
return res;
}
//
// Set and test
//
// Set test array of numbers
const num = [31,90];
// Test manual sort function
console.log(...sort(num,'asc'));
console.log(...sort(num,'desc'));
// Set test array of strings
const str = ['alpha','zetta','betta','xray','gamma','comma'];
// Test manual sort function
console.log(...sort(str,'asc'));
console.log(...sort(str,'desc'));
,
是的,因此您的问题始于第二个for
循环:
for(j = 0 ;j < bilnum - i; j++){
为什么?
负i代表着这样一个事实:在您第一次对数组进行完整的迭代之后,最右边的元素将位于正确的位置,但是您像这样忘记了- 1
:
for(j = 0 ;j < bilnum - i - 1; j++){
您的第二个bug在这里:
if(num[j] < num[j+1]){
应该是:
if(num[j] > num[j+1]){
为什么?
这是我们现在进行比较和交换逻辑的部分。请记住,您正在比较两个数字对,每个数字对都是这样。
因此,您将查看元素j
及其旁边的元素j + 1
。
您将查看元素j
是否更大,如果是,则将交换两个元素。
那么这就是将每一对的左侧和右侧进行比较的原因。
如果左侧较大,则需要交换这两个元素。
因此,您的第二个错误在这里:
num[j] = temp;
应该是:
temp = num[j];
最后一个错误是最后一行:
temp = num[j];
您已经成功地将右手侧扔到左侧,但是您并没有像上面那样将左手侧扔到右侧,
num[j + 1] = temp;
我认为将来可以为您提供帮助的是因为temp
的命名不正确,请将其重命名为leftHand
。
这显然是对每对左侧元素的引用。