java算法基础——冒泡排序算法
冒泡排序是数组元素按照升序或者降序基础的算法之一。也是学习算法需要掌握排序算法最为基础的一种。那什么是冒泡排序呢?基于字面意思,“冒泡”即是数组最小的那个元素往上冒,在往上冒的过程和相邻的元素进行位置交换。如下举例说明:
例:在整数数组int[] nums={22,15,33,10,12},经过4次比较,最大的元素33下层到数组最底部,小于33的元素往上“冒”。经过多次循环比较,将最终得到数组从小到大升序排列。
第一轮比较顺序如下:
1. nums[0]=22与nums[1]=15进行比较,22>15,进行位置交换,交换后nums[0]=15,nums[1]=22;
2. nums[1]=22与nums[2]=33进行比较,22<33,不进行交换,nums[1]=22,nums[2]=33;
3. nums[2]=33与nums[3]=10进行比较,33>10,进行位置交换,交换后num[2]=10,nums[3]=33;
4. nums[3]=33与nums[4]=12进行比较,33>12,进行位置交换,交换后nums[3]=12,num[4]=33.
那么问题来了,要比较多少轮,每轮要比较多少次呢?
注意观察第一轮比较,数组nums长度是5,比较了4次;
那么第二轮比较不需要在和33进行比较,因此只比较3次;
依次第三轮不需要和22进行比较,只比较2次;
第四轮不需要和15比较,只需要比较1次。
最终进过4轮比较结果如下图所示:(注意:第四轮,10比12小,因此没有进行交换。如果将12换成8,则10要和8进行交换)
对规律进行归纳:
1、对于数组int[] nums,数组长度为 nums.length,则比较的轮数是 i=nums.length-1 轮
2、每轮比较的次数 j=nums.length-1-i
对于上述案例用代码实现:
public class BubbleSort {
public static void main(String[] args) {
int[] nums = {22, 15, 33, 10, 12};//创建数组nums= {22, 15, 33, 10, 12}
System.out.println("打印输出初始状态数组"+Arrays.toString(nums));
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums.length - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j + 1];
nums[j + 1] = nums[j];
nums[j] = temp;
}
}
}
System.out.println("打印输出排序后数组"+Arrays.toString(nums));
}
}
排序结果如下图:
最后用一个口诀总结一下:
升序排列的口诀:
N个数字来排队
两两相比小靠前,
外层 循环次数:i=length-1
内层循环次数:j=length-i-1