在数据结构课程涉及到排序章节就基本不会少了冒泡排序,废话少说,开始冒泡排序学习。
1.冒泡排序的定义。
之所以叫冒泡排序,是因为水中的气泡一定是按照下面小,上面大排列的,形成一个有序的序列(书上看的,类比还是很形象的)。
2.冒泡排序的过程(这里默认从小到大排列)
从左边开始,相邻的两个数字进行对比,后一个比前一个大就不做操作,比前一个小就交换两个数字的位置,让较大的在后面,然后再从第二个位置与下一个位置的数字做比较,重复前面的操作,直到比较到最后一个数字,这样最大的数就会在最右边,然后再从头两两比较,一直到已经排好序列的前面一个数字,下面是示例和代码。
原始数据 3 2 5 4 1 7
第一次排序,比较3和2,3比2大,交换位置,新序列
2 3 5 4 1 7
第二次,位置移动到第二位也就是3和5比较,3比5小,不操作,新序列
2 3 5 4 1 7
第三次,位置移动到下一位,5和4比较,5比4大,交换,新序列
2 3 4 5 1 7
第四次,移动到下一位,5和1比较,5大于1,交换,新序列
2 3 4 1 5 7
第五次,移动到下一位,5和7比较,5小于7,不操作,新序列
2 3 4 1 5 7
这也就是第一轮的比较,让整个序列中最大的数交换到了最右边,第二轮就是重复第一轮动作,把第二大的数字移动到7之前,可以发现整个序列有6个数字,我们一共需要5轮比较,第一轮把7换到最右边,第二轮把5换到最右边,。。。剩下最后一个数就肯定是最小的了,也就不需要比较了,也就是当有N个数字我们需要比较N-1轮。其中第一轮需要比较5次才能把最大的换到最右边,以此类推,第二轮由于有一个已经确定7是最大,所以不需要再和7比较,所以需要比较4次,,不明白的话可以想象下这个画面,发现我们第一轮是第1个和第2个比,第2个和第3个比,一直到第5个和第6个比,每一轮需要比较(N-轮数)次。第一轮比较5次,6-1,第二轮有一个7确定了,减少一次,需要4次,6-2,第三轮5,7都确定了,需要3次,6-3。。。
import java.util.Scanner;
public class MaoPao {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new int[50];
int j=0;
for (int i = 50; i > 0; i--) {
arr[i-1] = j++;
}
//这里列举了50个数字
sort(arr);
//打印出排完序的数组
for(int i=0;i<arr.length;i++) {
System.out.println(" "+arr[i]);
}
}
//冒泡排序
public static int[] sort(int[] arr) {
//对于n个数据项 最多只需要n-1趟排序
int mid = 0;
//下标从0开始 比如数组长度10,10-1=9,i=8循环后+1,i=9,不再循环,0到8,比较了9轮,从0开始难理解可以让i从1开始,结束条件就是i<arr.length
for(int i=0;i<arr.length-1;i++) {
//每一趟需要比较n-1-轮数次
for(int j=0;j<arr.length-1-i;j++) {
if(arr[j] > arr[j+1]) {
//左边大于右边,交换
mid = arr[j];
arr[j] = arr[j+1];
arr[j+1] = mid;
}
}
}
return arr;
}
}
由于冒泡算法完成对N个数的排序,第一轮需要比较N-1次,第二轮N-2,知道比较结束需要(N-1)+(N-2)+….+1=N*(N-1)/2,所以算法的时间复杂度为O(N²)