一.冒泡法排序
对一个无序的数组进行排序,方法有很多,然而冒泡法排序也是这众多方法中最为稳定的,也是最为简单的一个排序方法。
此次我就利用js为大家详细讲解一下冒泡法排序吧~
二.思路
有一列数字:
44, 5, 23, 14, 6 , 87?
现在对他进行从大往小排序
排序思路:冒泡法排序中,需要比较n-1轮,n就是这一数列的长度。每一轮中需要将两两相邻的两个数字进行比较,之后对于不满足条件的进行置换位置,听到这里大家是不是觉得很绕,那么请继续往下看。
1.? ? 此次是第一轮比较
首先我们的条件是大到小。
?44>5 ,满足条件 便置于前面。此时不用置换位置,因为44本身就在前面。
?5<23,不满足条件,所以就置换位置,5和23置换,就变成了23,5 所以数列成为? 44,23,5,14,6,87
5<14,不满足,5和14置换位置,数列成了44,23,14,5,6,87
5<6 也是一样 进行置换 数列就成了 44,23,14,6,5,87
最后一次比较:5<87 同样还是置换 数列就成了 44,23,14,6,87,5
经过第一轮比较之后 我们就找到了本轮中最小的那一个,也就是这个数列中第1小的,他便被下潜到了最下面。
第二轮开始之前,我先给大家理一下思路:
我们每比较一轮时候,就会找到最小的那一个,但是后面的每一轮中这个最小的总是大于上一轮最小的,所以我们就可以确定下来,每经过一轮,那么这个最小的一定是这个数列中第一小的,第二小的,第三小的.....所以自然而然就不用每一轮都要再把这些小的拿进去参与比较。简言之,每比较完一轮,所需比较的数字就少一个。所以比较次数就可以看成为 总的轮次减上当前的轮次 所以就是arrleng - i ,arrlenght是总共需要比较的轮次? i是当前轮次
2.? 此次是第二轮比较
经过上一轮 第1小的5我们已经找到 所以本轮比较中我们不用他进行参与 原因上面有讲到
44>23 满足大到小 所以不用置换? ?23>14? 满足大到小 所以不用置换???14>6? 不用置换
6<87? 不满足大到小 置换位置 所以就变成了87,6 所以数列就成为了 44,23,14,87,6
在这一轮比较中,我们找出了这一轮最小的那一个数字6,他也就相当于是第2小?
所以最终数列成为了 44,23,14,87,6,5
?
3.? 此次是第三轮比较:
经过上一轮 第2小的6已经被我们找到 然后第1小的5我们也在第一轮找到 所以我们在本轮中都无需他们的参加??
44>23? ? 23>14? 都满足大到小的条件
14<87 不满足大到小的条件 所以我们进行置换位置? 就变成了87,14,所以数列就成为了44,23,87,14
至此,本轮比较完毕 我们这个数列最终就成为了 44,23,87,14,6,5
?
?4.? 此次是第四轮比较:
经过前面几轮,我们分别找到了这个数列中第1小的5,第2小的6,第3小的14,还是一样本轮以及后面的轮次中都无需他们的参与。
44>23 满足条件大到小条件 所以无需置换
23<87? 不满足大到小条件 所以两两置换 就变成了 87,23 所以数列就成为了 44,87,23
至此本轮比较完毕 我们找到了最小的那一个23 并将它置于最后 数列最终成为44,87,23,14,6,5
?
5.? 此次是第五轮比较:
44<87 不满足大到小 所以进行置换? 87,44 所以数列就成为了 87,44
至此本轮比较完毕 数列最终成为了87,44,23,14,6,5?
至此我们排序完毕。这个数列最终成为了 87,44,23,14,6,5?
?
总结
我们一共经过了5轮排序,所以我们就可以确定冒泡法排序需要经过n-1轮排序,然后又由上面我们得知?,每一轮比较中都需要两两相邻进行比较 ,所以我们可以得知 当条件满足时候进行用第3变量然后来置换这两个数值的位置 ,又因为我们从上面知道 每经过一轮 我们就找到了这个数列中第n小的那个数字 所以我们就无需他的参与 那么就可以得知 每一轮中比较次数可以看做为 总轮次-当前轮次 那么就为 arrlength - i?
废话不多说:上代码
三.代码
<script>
var arr=[44, 5, 23, 14, 6 , 87?];
console.log('原数组:'+arr);
//无序的整数数组
var arrlenght = arr.length-1;
//拿到这个数组的长度 然后减去1获取需要比较的轮数
var n=0;
//第三个变量 一会儿用来置换位置时候方便存放
for(i=0;i<arrlenght;i++){
//外层控制比较轮数 n-1轮 上面已经拿到了
for(j=0;j<arrlenght-i;j++){
/*内层用来控制需要比较多少次
这里还减去了一个轮数是因为每比较一轮
我们这个需要比较的数字就少一个*/
if(arr[j]<arr[j+1]){
/*相邻进行比较 所以就是j 和 j+1
所以满足这个条件时候进行置换 大的放前面*/
//这个是交换变量的通常方法 用第三个变量来替换
n = arr[j];
arr[j] = arr[j+1];
arr[j+1] = n;
}
}
}
console.log('排序后:'+arr);
</script>
四.总结
冒泡法的排序最重要的思想就是两两相邻进行排序,符合我们要求的条件的便上浮,不符合则下沉。在我们这次要求中,从大到小,所以符合大到小的就上浮,也就是大在前,小在后,不符合的则下沉,也就是小下沉到最后,大上浮到最上面。
|