js数组的冒泡排序
冒泡排序的基本思想:所谓冒泡就是泡泡一个个往上冒,让体积最轻的泡泡浮在最上面,然后按
照重量往下依次排列。
在数组中就是比较相邻两个元素的位置;
首先我们定义一个数组
var arr=[12,3,43,11,56,90,7,66,82];
做一个升序排序。第一轮循环我们得把值最大的数从数组中找出
来放在数组最后,即索弓|为a.length-1的位置。也就是从a[0]开始,依次往后比较相邻
两个数的大小。
按照思路:
首先是arr[0]和arr[1]比较,如果arr[0]>a[1], 则交换两个数的位置,反之则不交换。a[0]是12,a[1]是3, 所以得交换位置,交换完位置之后的数组是[3,12,43,11,56,90,7,66,82],然后比较arr[1]和arr[],(arr[1]= 12)< (arr[2]=43),不用交换位置,同理往后比较a[2]和arr[3],(arr[2]=43)>(arr[3]=11),交换位置,此时的数组arr为[3,12,11,43,56,90,7,66,82],以此类推,如果arr[j]>arr[j+ 1]就交换值,否则,继续往后。
代码:
var arr=[12, 3, 43, 11, 5, 9, 2, 4, 13 ];
for(var i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
console.log(arr);
通过该步骤已经的到了该数组中的最大值即数组中的最后一个元素,但是其他元素的排列并没有顺序,所以需要继续比较出数组中的第二大的值并放到数组的中的倒数第二位,在外层添加一个for循环即可;
代码:
var arr=[12, 3, 43, 11, 5, 9, 2, 4, 13 ];
for(var j = 0; j < arr.length - 1; j++) {
// 每次for循环都能找到一个最大值
for(var i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
console.log(arr);
第一轮循环完之后,我们得到的数组arr为
把值最大的43放已经放在在了数组的末尾。
所以在第二次循环,我们只需要比较到arr.length-2的位置即可,因为最后一项arr[arr.length-1]已经确定了(90) 。并且第三次循环,我们只需要比较到arr.length-3的位置,所以内重循环i的值为i< arr.length-1-j,通过两重循环,冒泡排序就完成了。
代码:
var arr=[12, 3, 43, 11, 5, 9, 2, 4, 13 ];
for(var j = 0; j < arr.length - 1; j++) {
// 每次for循环都能找到一个最大值
for(var i = 0; i < arr.length - 1 - j; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
console.log(arr);
由此总结出:
冒泡排序的原理
1、比较相邻的两个元素的大小,并交换两者的位置;
2、大的在后,小的在前(根据需求而定);
3、对所有相邻的两个元素进行比较,直到最后一个数字为最大值;
4、针对所有元素重复以上的步骤,除了已经排序好的元素(因为它没有比较意义了);
降序排序就是重最后一个元素比较到第一个元素
for(var j = arr.length - 1; j >=0 ; j--) {
// 每次for循环都能找到一个最大值
for(var i = arr.length - 1; i >= 0; i--) {
if (arr[i] < arr[i + 1]) {
var temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
console.log(arr);