算法学习之冒泡排序

javascript/jquery

浏览数:368

2019-11-1

算法在编程中的重要性开篇就不赘述啦,我们直接步入正题,开启算法学习之旅。
首先开始排序算法的学习,这也是面试比较常问的。今天我们就先来看一下冒泡排序。冒泡排序的思想是每轮都让相邻的两个元素进行比较,如果前一个元素大于后一个元素则交换位置,这样下来每一轮比较完成之后就会将最大的那个元素放在数组的最右边。
比如我们以数组

[5, 3, 7, 2, 9, 6, 8, 1, 0, 4]

为例,第一轮是

  1. 从5开始,并和与他相邻的元素进行比较,发现3小于5,那么我们交换他两的位置,
  2. 然后接着拿5和7进行比较,发现5小于7,则继续
  3. 将7和他的下一个元素进行比较,若7大于下一个元素则进行1步骤,否则进行2步骤。直至比较到数组的最后一个元素。

第二轮就是重复第一轮的操作,直至比较到数组的倒数第二个元素。
……
……
……
理解了思想我们来看下代码实现。

var arr = [5, 3, 7, 2, 9, 6, 8, 1, 0, 4];
for(var i = 0, len = arr.length - 1; i < len; i++){
    for(var j = 0, lenj = arr.length - 1 - i; j < lenj; j++){
        if(arr[j] > arr[j+1]){
            var temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;
        }
    } 
} 

这样下来冒泡排序的时间复杂度为O(N^2),我们在优化一下这段代码,比如在第k轮的时候没有进行元素交换,那么是不是就说明在第k轮时该数组就已经是一个有序数组轮呢?答案是肯定的,那么我们对上述代码做如下修改:

var arr = [5, 3, 7, 2, 9, 6, 8, 1, 0, 4],
    flag = false;
for(var i = 0, len = arr.length - 1; i < len; i++){
    flag = true;
    for(var j = 0, lenj = arr.length - 1 - i; j < lenj; j++){
        if(arr[j] > arr[j+1]){
            flag = false;
            var temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;
        }
    }
    if(flag) break;
} 

我们定义了一个flag标志,当数组在某一轮没有进行任何元素交换的时候,我们就可以知道此时的数组已经是一个有序数组,因此就结束循环。
对冒泡排序还有更多的可扩展性,欢迎各路大神指点。

作者:无敌小豆姐