编程必备:排序算法之冒泡排序,就是这么简单
本篇文章教你最基础的排序算法之一冒泡排序
一、概念解释
冒牌排序:这个算法的特点就是让最大的数字慢慢的冒泡浮到末端,故称冒泡排序
具体过程:如果数组的长度为8,那么冒泡排序的比较共有7轮(n-1),每一轮将最大的数字筛选移至末端。
具体每一轮的比较方式是从最前面开始相邻两个数字两两比对,把较大的数字放至右侧,以此类推,每一轮就可以将最大的数字放至末端。
二、图片辅助理解
我们假设有一个数组如下,长度为8
int arr[] = {33,19,62,89,8,18,75,29};
第一轮排序如下:
第一次排序:33和19比较,33比19大,交换位置
第二次排序:33和62比较,33比62小,不用交换
第三次排序:62和89比较,62比89小,不用交换
第四次排序:89和8比较,89比8大,交换位置
第五次排序:89和18比较,89比18大,交换位置
第六次排序:89和75比较,89比75大,交换位置
第七次排序:89和29比较,89比29大,交换位置
第一轮交换结束,最大的数是89,移动至最末端
第二轮排序如下
第一次排序:19和33比较,19比33小,不用交换
第二次排序:33和62比较,33比62小,不用交换
第三次排序:62和8比较,62比8大,交换位置
第四次排序:62和18比较,62比18大,交换位置
第五次排序:62和75比较,62比75小,不用交换
第六次排序:75和29比较,75比29大,交换位置
由于第一轮已经将最大的数字移至最末端,所以最末端的数字就不参与比较
第二轮交换结束,最大的数是75,移动至倒二末端
第三轮排序如下
第一次排序:19和33比较,19比33小,不用交换
第二次排序:33和8比较,33比8大,交换位置
第三次排序:33和18比较,33比18大,交换位置
第四次排序:33和62比较,33比62小,不用交换
第五次排序:62和29比较,62比29大,交换位置
第三轮交换结束,最大的数是62,移动至倒三末端
第四轮排序如下
第一次排序:19和8比较,19比8大,交换位置
第二次排序:19和18比较,19比18大,交换位置
第三次排序:19和33比较,19比33小,不用交换
第四次排序:33和29比较,33比29大,交换位置
第四轮交换结束,最大的数是33,移动至倒四末端
第五轮排序如下
第一次排序:8和18比较,8比18小,不用交换
第二次排序:18和19比较,18比19小,不用交换
第三次排序:19和29比较,19比29小,不用交换
第五轮交换结束,最大的数是29,移动至倒五末端
第六轮排序如下
第一次排序:8和18比较,8比18小,不用交换
第二次排序:18和19比较,18比19小,不用交换
第六轮交换结束,最大的数是62,移动至倒六末端
第七轮排序如下
第一次排序:8和18比较,8比18小,不用交换
第七轮交换结束,最大的数是62,移动至倒七末端
三、总结规律
1.首先比较的轮次是数组的长度-1 ,因为最后一轮只有一个数不用比较。
2.其次每一轮中需要排序的次数。第1轮比较7次,第二轮比较6次,以此类推,所以轮次是数组的长度-目前的轮次
3.每一轮里面做的事情是从前往后开始两两比较,如果右边的数比左边的数大,那么左右进行交换。
四、转化代码
从规律中我们很容易看出来这是双层for循环,外层控制比较的轮次,内层控制每轮的排序次数;
外层因为我们习惯i=0开始遍历,所以条件改为arr.length-1。满足比较的轮次是数组长度-1;
内层从0开始遍历,同理初始条件改为arr.length-1。由于还要减去目前的轮次,所以条件变为arr.length-1-i;
内层逻辑代码是当前面的数比后面的数大时,那么两两交换
public void sort() {
int arr[] = {33,19,62,89,8,18,75,29};
//循环的轮次是数组的长度-1
//i循环从0开始,总共循环0,1,2,3,4,5,6 共7次
for (int i = 0; i < arr.length-1; i++) {
//j循环从0开始,第一轮循环7次,第二轮循环6次,以此类推到1次。
for (int j = 0; j < arr.length-1-i; j++) {
//如果前面一个数比后面一个数大
if(arr[j]>arr[j+1]){
//那么两两交换
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
以上就是本篇文章的全部内容了。