首先要明白,冒泡排序(选择排序法)是将数组的中数据按照指定的顺序进行排列,既然要排列,那么我们就要应该比较两个数的大小,然后令其交换位置便实现了位置的交换。这时就出现一个问题,如何实现一个数与每个数进行一次比较,我们可以用一个双层for循环,外层循环一次,内侧循环一圈。这时便实现了一个数与其余的数进行比较,然后我们就可以比较大小,令其交换。
<script> /* 选择排序法:用数组中的每一个元素和他后面的元素做比较,如果符合调换条件,则交换两个值的位置 */ var arr=[12,54,65,4,45,45,564,58,854,5,456,89,42,689,454,897,40,56,787,894564,8,7]; //遍历,利用循环,将第一个元素与后面的每一个元素都进行比较,然后length-1是因为遍历到最后一个元素是,没有必要在遍历一次,所以可有可无 for(var i=0;i<arr.length-1;i++){ //因为第一次循环已经有两个数进行比较了,所以这次循环长的初始值就为i(当前的次数)+1 for(var j=i+1;j<arr.length;j++){ //进行判断,如果第一个的值大于第二个数的值,那么就按照(升序)进行排序 if(arr[i]>arr[j]){ //创建一个新的变量,值为空,作为讲个数值交换为位置时存放的位置 //将arr[1]赋值给type,这时arr[1]为空值 var type=arr[i]; //将arr[j]赋值给arr[i],这时arr[j]为空值 arr[i]=arr[j]; //将type赋值给arr[j];完成两个数值的位置交换 arr[j]=type; } } } console.log(arr); </script>
两种方法 原理都一样。
<script> var arr=[21,5,7,6,65,8,6,36,89] for(var i=0;i<=arr.length-1;i++){//外层循环管趟数 for(var j=0;j<=arr.length-i-1;j++){//里层循环负责交换的次数 if(arr[j]<arr[j+1]){ // var temp=arr[j]; // arr[j]=arr[j+1] // arr[j+1]=temp //这里使用了es6的结构赋值,与上面两个值交换方法一样 [arr[j],arr[j+1]]=[arr[j+1],arr[j]] } } } console.log(arr); </script>