JavaScript中数组的冒泡排序方法
冒泡排序的基本思想
顾名思义,满足条件的元素一个个的向上冒。在数组中就是比较相邻的两个元素,数值大的跟数值小的进行位置交换,在一次跟相邻的元素做比较,层层递进,互换元素的位置。
冒泡排序的原理
1、比较相邻的两个元素的大小,并交换两者的位置;
2、大的在后,小的在前(根据需求而定);
3、对所有相邻的两个元素进行比较,直到最后一个数字为最大值;
4、针对所有元素重复以上的步骤,除了最后一个元素(因为它没有比较对象了)
注意:虽然数组排序有sort方法,但是如果数组中是对象的话,sort方法就不适用啦,所有我们就手写一个排序方法。再者,我们不是为了排序而学习,而是为了接触算法而学习,为了锻炼逻辑思路而学习。
// 新建一个数组
var arr = [15, 45, 648, 4, 35, 13, 55, 97];
// 外层for循环遍历一次,内层for循环走arr.length次
for (var i = 0; i < arr.length; i++) {
// 内层for循环走一遍,只是进行了第一遍判断
for (var j = 0; j < arr.length - 1 - i; j++) {
// 当第一个数大于第二个数,进行判断交换位置
if (arr[j] > arr[j + 1]) {
// 声明一个变量用来存储大的那个数,然后进行位置交换
var item = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = item;
}
}
// 这里打印的是一步一步比较大小交换位置的arr
console.log(arr);
}
//这里打印的是最终结果
console.log(arr);
首先是arr[0]和arr[1]比较,如果arr[0]>a[1], 则交换两个数的位置,反之则不交换。然后比较arr[1]和arr[2],不用交换位置,同理往后比较a[2]和arr[3],交换位置,以此类推,如果arr[j]>arr[j+ 1]就交换值,否则,继续往后。
通过该步骤已经的到了该数组中的最大值即数组中的最后一个元素,但是其他元素的排列并没有顺序,所以需要继续比较出数组中的第二大的值并放到数组的中的倒数第二位,在外层添加一个for循环
因为在第一次循环的时候已经将最大值放在了数组的最后一个位置,所以在第二次循环,我们只需要比较到arr.length-2的位置即可,因为最后一项arr[arr.length-1]已经确定了 。并且第三次循环,我们只需要比较到arr.length-3的位置,所以内重循环i的值为j< arr.length-1-j,通过两重循环,冒泡排序就完成了。