冒泡排序 javascript 代码几乎不需要解释
Bubble sort javascript code need explanation little
我写冒泡排序程序是为了好玩,但我不明白的是
j<len-i
行在此代码中的作用是什么?
我可以从上面的行中删除 -i 它也可以,
var arr=[3,5,4,7,8,9,30,0,-1];
function bubble_Sort(arr){
var len = arr.length,
i, j, stop;
for (i=0; i < len; i++){
for (j=0; j<len-i; j++){
if (arr[j] > arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
console.log(bubble_Sort(arr));
//with -i in second for loop
var arr=[3,5,4,7,8,9,30,0,-1];
function bubble_Sort(arr){
var len = arr.length,
i, j, stop;
for (i=0; i < len; i++){
for (j=0; j<len-i; j++){
if (arr[j] > arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
console.log(bubble_Sort(arr));
在第二个循环中没有-i
如果你为每个 "i" 循环记录 arr,你就会明白为什么会这样。
var arr=[3,5,4,7,8,9,30,0,-1];
function bubble_Sort(arr){
var len = arr.length,
i, j, stop;
for (i=0; i < len; i++){
for (j=0; j<len-i; j++){
if (arr[j] > arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
console.log(arr)
}
return arr;
}
console.log(bubble_Sort(arr));
(9) [3, 4, 5, 7, 8, 9, 0, -1, 30]
(9) [3, 4, 5, 7, 8, 0, -1, 9, 30]
(9) [3, 4, 5, 7, 0, -1, 8, 9, 30]
(9) [3, 4, 5, 0, -1, 7, 8, 9, 30]
(9) [3, 4, 0, -1, 5, 7, 8, 9, 30]
(9) [3, 0, -1, 4, 5, 7, 8, 9, 30]
(9) [0、-1、3、4、5、7、8、9、30]
(9) [-1, 0, 3, 4, 5, 7, 8, 9, 30]
(9) [-1, 0, 3, 4, 5, 7, 8, 9, 30]
(9) [-1, 0, 3, 4, 5, 7, 8, 9, 30]
每i个循环,它把第i个大数移到底部,所以最后i个数是稳定的。
考虑数组(按升序排序):
[4, 3, 2, 1]
在 运行 与 i = 0
的内部循环之后,您将得到:
[3, 2, 1, <strong>4</strong>]
现在,i=1
...
再次重复该过程,在下一次迭代时 i=1
您将得到:
[2, 1, <strong>3, 4</strong>]
现在,i=2
同样,在 i=2
处再次重复循环,您将得到:
[1, <strong>2, 3, 4</strong>]
现在i=3
注意 粗体 数字是如何排列的。
这里我们有一个外循环的loop invariant(即对外循环的每次迭代都成立的语句),即数组的最后i
项在排序顺序。或者,另一种看待它的方式是 [0, ... length-i)
数组中的所有项目都是 未 排序的,因此索引 length-i
及以后的项目是排序的订单。
换句话说,当你查看你的数组时,你可以看到在外循环的每次迭代之后,数组 length-i, ..., length
中的所有项目都按排序顺序排列,因此不需要re-sort/re-check 他们。
因此,提供 len-i
可防止您重新检查已排序的项目,因为您知道它们不需要更改。
这是因为每次对最后一个元素进行排序。每次迭代后,您会发现最后一个元素位于正确的位置(第 0 次迭代 - 最后一个元素位于正确位置,第 1 次迭代 - 最后 2 个元素位于正确位置,依此类推)。所以每次我们循环遍历 len - i 个元素。
减号 i 是为了说明这样一个事实,即在您第一次对数组进行完整迭代后,最右边的元素将位于正确的位置。因此,您以后不必再尝试 re-sort 了。这就是为什么你在那里有负号 i 的原因。
我写冒泡排序程序是为了好玩,但我不明白的是
j<len-i
行在此代码中的作用是什么?
我可以从上面的行中删除 -i 它也可以,
var arr=[3,5,4,7,8,9,30,0,-1];
function bubble_Sort(arr){
var len = arr.length,
i, j, stop;
for (i=0; i < len; i++){
for (j=0; j<len-i; j++){
if (arr[j] > arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
console.log(bubble_Sort(arr));
//with -i in second for loop
var arr=[3,5,4,7,8,9,30,0,-1];
function bubble_Sort(arr){
var len = arr.length,
i, j, stop;
for (i=0; i < len; i++){
for (j=0; j<len-i; j++){
if (arr[j] > arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
console.log(bubble_Sort(arr));
在第二个循环中没有-i
如果你为每个 "i" 循环记录 arr,你就会明白为什么会这样。
var arr=[3,5,4,7,8,9,30,0,-1];
function bubble_Sort(arr){
var len = arr.length,
i, j, stop;
for (i=0; i < len; i++){
for (j=0; j<len-i; j++){
if (arr[j] > arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
console.log(arr)
}
return arr;
}
console.log(bubble_Sort(arr));
(9) [3, 4, 5, 7, 8, 9, 0, -1, 30]
(9) [3, 4, 5, 7, 8, 0, -1, 9, 30]
(9) [3, 4, 5, 7, 0, -1, 8, 9, 30]
(9) [3, 4, 5, 0, -1, 7, 8, 9, 30]
(9) [3, 4, 0, -1, 5, 7, 8, 9, 30]
(9) [3, 0, -1, 4, 5, 7, 8, 9, 30]
(9) [0、-1、3、4、5、7、8、9、30]
(9) [-1, 0, 3, 4, 5, 7, 8, 9, 30]
(9) [-1, 0, 3, 4, 5, 7, 8, 9, 30]
(9) [-1, 0, 3, 4, 5, 7, 8, 9, 30]
每i个循环,它把第i个大数移到底部,所以最后i个数是稳定的。
考虑数组(按升序排序):
[4, 3, 2, 1]
在 运行 与 i = 0
的内部循环之后,您将得到:
[3, 2, 1, <strong>4</strong>]
现在,i=1
...
再次重复该过程,在下一次迭代时 i=1
您将得到:
[2, 1, <strong>3, 4</strong>]
现在,i=2
同样,在 i=2
处再次重复循环,您将得到:
[1, <strong>2, 3, 4</strong>]
现在i=3
注意 粗体 数字是如何排列的。
这里我们有一个外循环的loop invariant(即对外循环的每次迭代都成立的语句),即数组的最后i
项在排序顺序。或者,另一种看待它的方式是 [0, ... length-i)
数组中的所有项目都是 未 排序的,因此索引 length-i
及以后的项目是排序的订单。
换句话说,当你查看你的数组时,你可以看到在外循环的每次迭代之后,数组 length-i, ..., length
中的所有项目都按排序顺序排列,因此不需要re-sort/re-check 他们。
因此,提供 len-i
可防止您重新检查已排序的项目,因为您知道它们不需要更改。
这是因为每次对最后一个元素进行排序。每次迭代后,您会发现最后一个元素位于正确的位置(第 0 次迭代 - 最后一个元素位于正确位置,第 1 次迭代 - 最后 2 个元素位于正确位置,依此类推)。所以每次我们循环遍历 len - i 个元素。
减号 i 是为了说明这样一个事实,即在您第一次对数组进行完整迭代后,最右边的元素将位于正确的位置。因此,您以后不必再尝试 re-sort 了。这就是为什么你在那里有负号 i 的原因。