Javascript 从关联数组中找出最小数(冒泡排序法)
Javascript finding lowest number from associative array (bubble sort method)
所以我尝试将冒泡排序技术应用于关联数组。
我尝试的是创建一个普通数组,然后应用冒泡排序。
这行得通,所以现在我正在尝试对我的关联数组执行相同的操作,但我不明白为什么它不起作用,有人可以解释并告诉我该怎么做吗?
普通数组冒泡排序代码: <-- 这个有效
var numbers= new Array()
numbers[0] = 22;
numbers[1] = 3;
numbers[2] = 65;
numbers[3] = 75;
numbers[4] = 500;
numbers[5] = 2;
numbers[6] = 44;
for(var i=0; i<numbers.length; i++)
{
if(numbers[i] < numbers[i+1])
{
var tempGetal = numbers[i];
numbers[i] = numbers[i+1];
numbers[i+1] = tempGetal;
}
}
console.log("Smallest number from array is " + tempGetal);
关联数组冒泡排序代码: <-- 不起作用
var celsius= new Array()
celsius["Monday"] = 22;
celsius["Tuesday"] = 3;
celsius["Wednesday"] = 65;
celsius["Thursday"] = 75;
celsius["Friday"] = 1;
celsius["Saterday"] = 2;
celsius["Sunday"] = 44;
for(var temp in celsius)
{
if(celsius[temp] < celsius[temp+1])
{
var tempGetal = celsius[temp];
celsius[temp] = celsius[temp+1];
celsius[temp+1] = tempGetal;
}
}
console.log("Smallest number from this array is " + tempGetal[temp]);
谁能告诉我我尝试应用的方法是否可行?
提前致谢!
您的尝试失败的原因有多种,但您的假设存在根本性缺陷:对象中属性的顺序未定义,因此您不应尝试重新排列它们。
真的没有理由为此使用排序。只需遍历对象一次并找到最低值:
var min = Infinity;
for(var day in celsius) {
if(celsius[day] < min) {
min = celsius[day];
}
}
console.log(min);
更高级的解决方案:
var celsius = [];
celsius["Monday"] = 22;
celsius["Tuesday"] = 3;
celsius["Wednesday"] = 65;
celsius["Thursday"] = 75;
celsius["Friday"] = 1;
celsius["Saterday"] = 2;
celsius["Sunday"] = 44;
var min = Object
.keys(celsius)
.map(function(key) {
return celsius[key];
})
.reduce(function(last, next) {
return last < next ? last : next;
}, Infinity);
console.log(min);
您方法的其他问题:
- Javascript 没有关联数组。您通常不应创建数组并为其分配命名属性(这就是对象的用途)。
- 如果您使用
for(var temp in celsius)
遍历对象,temp
将是 属性 名称,而不是温度或数字索引。
- 考虑到前面的项目符号,如果
temp
的值为 "Monday"
,则 celsius[temp + 1] = tempGetal
会将 tempGetal
分配给 属性 Monday1
.
郑重声明,您的冒泡排序无法正常工作,因为您应该一直排序直到没有任何移动为止,例如
// Sort an array of Numbers
function bubbleSort(arr) {
var oneMoved, // flag if one moved
i, // counter
t; // temp variable
do {
// reset flag
oneMoved = false;
// reset counter
i = arr.length - 1;
while (i--) {
// If array members are out of sequence, swap
if (arr[i] > arr[i+1]) {
t = arr[i];
arr[i] = arr[i+1]
arr[i+1] = t;
// Remember that one moved
oneMoved = true;
}
}
// Keep going as long as one moved
} while (oneMoved)
// Not necessary as array sorted in place, but means function
// can be chained
return arr;
}
// Quick test
var arr = [0, 3, 6, -2, 3];
console.log(bubbleSort(arr)); // [-2, 0, 3, 3, 6]
所以我尝试将冒泡排序技术应用于关联数组。
我尝试的是创建一个普通数组,然后应用冒泡排序。 这行得通,所以现在我正在尝试对我的关联数组执行相同的操作,但我不明白为什么它不起作用,有人可以解释并告诉我该怎么做吗?
普通数组冒泡排序代码: <-- 这个有效
var numbers= new Array()
numbers[0] = 22;
numbers[1] = 3;
numbers[2] = 65;
numbers[3] = 75;
numbers[4] = 500;
numbers[5] = 2;
numbers[6] = 44;
for(var i=0; i<numbers.length; i++)
{
if(numbers[i] < numbers[i+1])
{
var tempGetal = numbers[i];
numbers[i] = numbers[i+1];
numbers[i+1] = tempGetal;
}
}
console.log("Smallest number from array is " + tempGetal);
关联数组冒泡排序代码: <-- 不起作用
var celsius= new Array()
celsius["Monday"] = 22;
celsius["Tuesday"] = 3;
celsius["Wednesday"] = 65;
celsius["Thursday"] = 75;
celsius["Friday"] = 1;
celsius["Saterday"] = 2;
celsius["Sunday"] = 44;
for(var temp in celsius)
{
if(celsius[temp] < celsius[temp+1])
{
var tempGetal = celsius[temp];
celsius[temp] = celsius[temp+1];
celsius[temp+1] = tempGetal;
}
}
console.log("Smallest number from this array is " + tempGetal[temp]);
谁能告诉我我尝试应用的方法是否可行?
提前致谢!
您的尝试失败的原因有多种,但您的假设存在根本性缺陷:对象中属性的顺序未定义,因此您不应尝试重新排列它们。
真的没有理由为此使用排序。只需遍历对象一次并找到最低值:
var min = Infinity;
for(var day in celsius) {
if(celsius[day] < min) {
min = celsius[day];
}
}
console.log(min);
更高级的解决方案:
var celsius = [];
celsius["Monday"] = 22;
celsius["Tuesday"] = 3;
celsius["Wednesday"] = 65;
celsius["Thursday"] = 75;
celsius["Friday"] = 1;
celsius["Saterday"] = 2;
celsius["Sunday"] = 44;
var min = Object
.keys(celsius)
.map(function(key) {
return celsius[key];
})
.reduce(function(last, next) {
return last < next ? last : next;
}, Infinity);
console.log(min);
您方法的其他问题:
- Javascript 没有关联数组。您通常不应创建数组并为其分配命名属性(这就是对象的用途)。
- 如果您使用
for(var temp in celsius)
遍历对象,temp
将是 属性 名称,而不是温度或数字索引。 - 考虑到前面的项目符号,如果
temp
的值为"Monday"
,则celsius[temp + 1] = tempGetal
会将tempGetal
分配给 属性Monday1
.
郑重声明,您的冒泡排序无法正常工作,因为您应该一直排序直到没有任何移动为止,例如
// Sort an array of Numbers
function bubbleSort(arr) {
var oneMoved, // flag if one moved
i, // counter
t; // temp variable
do {
// reset flag
oneMoved = false;
// reset counter
i = arr.length - 1;
while (i--) {
// If array members are out of sequence, swap
if (arr[i] > arr[i+1]) {
t = arr[i];
arr[i] = arr[i+1]
arr[i+1] = t;
// Remember that one moved
oneMoved = true;
}
}
// Keep going as long as one moved
} while (oneMoved)
// Not necessary as array sorted in place, but means function
// can be chained
return arr;
}
// Quick test
var arr = [0, 3, 6, -2, 3];
console.log(bubbleSort(arr)); // [-2, 0, 3, 3, 6]