冒泡排序

199 阅读2分钟

一、冒泡排序的概念

冒泡排序其实就是一种算法,它把一系列的数据按照一定的顺序进行排列显示(从小到大或者从大到小)。

二、思路

比如有一组数组:var arr = [7,5,9,4,6]; 我们需要重复的走访想要排列的元素,依次比较两个相邻的元素,从而达到从小到大或者从大到小的顺序。 这边就以从大到小的顺序来排列吧。

在这组数据中arr[0]也就是7,依次和后面的元素相比较只要7大于相比较的数,那么就相互交换位置。

现在开始第一趟的比较,7和5相比较 7>5,所以7和5交换位置,此时7就在arr[1]这个位置了,而5就在arr[0]这个位置了,接着7再和后面的arr[2]=9相比较,7<9,此时7和9的位置不发生交换这时候该数组的位置是 var arr = [5,7,9,4,6],然后在往后面就是9和之后的元素来比较大小了,所以此时arr[2]=9和arr[3]=4相比较9>4,所以9和4交换位置,此时的数组中元素的位置是 var arr = [5,7,4,9,6]。然后9再接着和最后一个元素6作比较,9>6,所以继续交换位置,这样一来就确定了9是该数组中对大的元素了,此时的元素位置是 var arr = [5,7,4,6,9]。至此通过4次的比较完成了第一趟的比较。

接着再来开始第二趟的比较,在第一轮结束的时候数组顺序为 var arr = [5,7,4,6,9],现在我们让第一个数据arr [0] = 5来和后面的元素相比较,首先和7比较之后,5<7所以不交换位置,接着就由7和后面的元素进行比较了,7和4比较7>4,交换位置,此时数组顺序为 var arr = [5,4,7,6,9],然后7和6比较,7>6交换位置,此时数组顺序为 var arr = [5,4,6,7,9],由于第一趟已经确定了9的位置,所以此时无需再和9座比较了,至此第二趟通过了3次比较确定了7的位置。

第三趟比较,第二轮结束后的状态为 var arr = [5,4,6,7,9],首先5和4比较 5>4,交换位置,var arr = [4,5,6,7,9],接着5再和6比较5<6,位置不变,由于7和9位置已经确定了 ,所以6就无需往下比较,此时数组顺序为 var arr = [4,5,6,7,9],第三趟通过2次比较确定了6的位置。

现在开始第四趟比较,第三趟结束状态为 var arr = [4,5,6,7,9],首先4和5比较 4<5,位置不变,所以5的位置通过1次比较也随之确定了。

因为该数组只有5个元素,当你已经确定好其中4个元素的位置的时候,最后一个元素位置也就随之确定下来了,所以不用再进行第五趟比较了。

在前端中我们用 arr.length来表示数组元素的个数,在上面的数组中我们一共有5个元素,所以arr.length=5,通过上面的思路我们就可以发现虽然数组元素有5个,但是我们只比较了4次,所以比较的趟数是arr.length-1次。代码是:for(var i = 0;i<arr.length-1;i++)。

同时,元素之间的相互交换我们可以用我上一篇写的如何交换两个变量的值思路来实现。那么还有一个问题就是,在每一趟的交换中元素交换的次数,该怎么表示呢?第一趟中元素交换了4次,第二趟元素交换了3次,第三趟2次,第四趟1次。这样就可以得到这样一个思路:每一趟交换的次数=总趟数-当前的趟数。即arr.length-1-i。代码为:for (var j = 0;j<=arr.length-1-i)。

通过上面的思路我们不难发现,在每趟循环的同时还进行着数据的交换,因此想要实现这一效果,用嵌套for循环是再好不过了。

代码

 var arr = [7,5,9,4,6];

            for(var i = 0; i<arr.length-1;i++){            //外层循环管趟数

                for(var j =0;j<=arr.length-1-i;j++){       //内层循环管每一趟交换的次数

                    if(arr[j]>arr[j+1]){

                        var temp = arr[j];

                        arr[j]=arr[j+1];

                        arr[j+1]=temp;

                    }

                }

            }

            console.log(arr);
            

刚学的冒泡排序如有不对还请大佬指出来,可能说的比较啰嗦哈哈哈。