渴望成为大牛的男人

渴望成为大牛的男人

  因为这三种基本的排序算法原理都很简单,所以在思路这块我就不做过多的解释了,我们把重点放在最后的冒泡排序如何优化上面

 一、选择排序

 二、快速排序

    三、冒泡排序

  通过上面的代码可以看出来,通过两次简单的for循环,并且不加任何判断语句的形式的算法注定是低效的,以下是对冒泡排序算法的三种优化


 (1)、当我们对一个数组arr=[9,1,2,3,4,5,6]进行排序的时候,我们正常冒泡排序的话,还是会每个数字都排一次,但事实上我们第一次排序进行完之后,数组就已经变成[1,2,3,4,5,6,9],已经达到我们想要的效果了,所以已经不需要再进行其他元素的排序了,所以我们要对这种传统的冒泡排序算法做一个优化,思路大概是这样的:我们定义一个flag,当某一次排序中没有发生元素的交换的话,设置flag为false,当flag为false的时候直接结束后面的循环,这样的话数组就不会再进行后面的无意义的排序了,代码实现:

    var arr = [9,1,2,3,4,5,6]
    function bubbleSort(arr){
    var temp;
    var flag;       //定义flag,用来判断数组是否已经有序
    for(var i=0;i<arr.length;i++){
        flag = true     //我们设置flag初始值为true
        for(var j=0;j<arr.length-i;j++){
            if(arr[j]>arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                flag = false;   //我们自己规定flag为false的时候说明数组需要继续排序
            }
        }
        if(flag){   //我们可以规定如果某次循环后flag依然为true的话,表明这次没有进行重新的元素交换,也就是说没有进行重新排序,那么此时数组中元素已经有序了,所以我们可以直接break跳出循环,return出数组
            break;
        }
    }

    return arr;
}

(2)、第二种优化是从另一个角度来考虑的,并且也是基于第一次优化的思想,我们每次排序后,数组的后面有一部分已经有序了,所以我们也不需要再和后面已经排好序的元素再进行比较了,我们可以这样做,用一个变量来记录下最后一次发生交换的位置,后面没有发生交换的其实已经有序了,所以可以用这个值来作为一一次我们比较结束时的位置,将会减少很多次没必要的排序过程,代码实现如下:

    var arr = [9,1,10,5,6,3,0]
    function bubbleSort(arr){
    var temp;
    var flag;       //定义flag,用来判断数组是否已经有序
    var lastindex = 0;       //定义lastindex,用来判记录每次排好序时的最后一次交换的位置
    var k = arr.length-1;          //用来和lastindex配合,作为每次循环的边界值,实现不会进行没必要排序的效果
    for(var i=0;i<arr.length;i++){
        flag = true     //我们设置flag初始值为true
        for(var j=0;j<k;j++){
            if(arr[j]>arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                flag = false;   //我们自己规定flag为false的时候说明数组需要继续排序
                lastindex = j;  //来记录最后一次交换元素的下标
            }
        }
        k = lastindex
        if(flag){   //我们可以规定如果某次循环后flag依然为true的话,表明这次没有进行重新的元素交换,也就是说没有进行重新排序,那么此时数组中元素已经有序了,所以我们可以直接break跳出循环,return出数组
            break;
        }
    }

    return arr;
}

 

12-08 12:26