为什么我的冒泡排序代码总是显示重复的数字?
Why does My Bubble sort code always show me repeated numbers?
最近我尝试使用 JavaScript 测试我自己的冒泡排序代码,但问题是每次我 运行 它的输出仍然显示相同的结果。它重复打印数组中的最后一个索引。谁能帮帮我,我还是个新手。
顺便说一句,这是代码。
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)
你的问题在这里:
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,23,55,2,13,90];
var bilnum = num.length,i ,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)
这是因为,您正在为同一个分配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)
另一种手动排序数组的方法,仅供娱乐
// 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,23,55,2,13,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++){
你的第二个错误在这里:
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
.
这更明显地表明这是对每对左侧元素的引用。
最近我尝试使用 JavaScript 测试我自己的冒泡排序代码,但问题是每次我 运行 它的输出仍然显示相同的结果。它重复打印数组中的最后一个索引。谁能帮帮我,我还是个新手。
顺便说一句,这是代码。
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)
你的问题在这里:
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,23,55,2,13,90];
var bilnum = num.length,i ,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)
这是因为,您正在为同一个分配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)
另一种手动排序数组的方法,仅供娱乐
// 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,23,55,2,13,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++){
你的第二个错误在这里:
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
.
这更明显地表明这是对每对左侧元素的引用。