如何使用JavaScript实现冒泡排序

说明

Javacript数组中最常见的就是冒泡排序了,冒泡排序相对来说比较简单,而且在面试当中,有很大概率会问到,所以学会并且理解还是很重要的。

实现原理

数组中有n个数,而我们要将其进行从小到大的排列。那么我们就可以将相邻的两个数是进行比较,如果前者大于后者,就把两个数交换位置,把大的值一步步往后移。这样一来,第一轮就可以选出一个最大的数放在最后面;那么经过 n-1(数组的 length - 1) 轮,就完成了所有数的排序。如下图:
在这里插入图片描述

现在我们先实现第一步,将最大值移动到数组的最后一个。

var arr = [3,4,1,2];
// 遍历数组,次数就是arr.length - 1
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)  // [3, 1, 2, 4]

通过上面的代码我们能找到数组中最大的数,并放到最后,所以到我们要将所以数都进行排序时,那么就要重复 arr.length - 1 次,便可以实现数组按从小到大的顺序排列

 var arr = [3,4,1,2];
// 遍历数组,次数就是arr.length - 1
for (var i = 0; i< arr.length - 1; i++) {
 // 这里 j < arr.length - 1 ,要思考思考合适吗?我们下面继续说
 for (var j = 0; j < arr.length - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            var temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
 }
}

这里有个细节可能不会注意,我在刚开始弄得时候也没发现,虽然上面实现了冒泡排序,得到的结果也是正确的。但我们会发现第一次就找到了最大值,内层中的for循环每步仍然排序到那个最后面的最大值。这是不必要的操作,所以只需要将内层 for 循环的次数,改成 i< arr.length - 1 -j 。

var arr = [3, 4, 1, 2];  
var times=0 //冒泡的次数    
 function bubbleSort (arr) {                    
 for (var i = 0; i < arr.length - 1; i++) {           
 for (var j = 0; j < arr.length - 1-i; j++) {  
 // 这里要根据外层for循环的i,逐渐减少内层 for循环的次数      
    if (arr[j] > arr[j + 1]) {              
          arr temp = arr[j];               
          arr[j] = arr[j + 1];            
          arr[j + 1] = temp;                              
          console.log('第'+(++times)+'次排序后'+arr);                    
          }                          
       }                            
   }        
}          
bubbleSort(arr);

原数组是:
arr = [1,2,4,3];
输出结果是:

第1次排序后3,1,4,2
第2次排序后3,1,2,4
第3次排序后1,3,2,4
第4次排序后1,2,3,4

转载 https://blog.csdn.net/fe_dev/article/details/79600448

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值