冒泡排序的核心就是依次比较相邻的两个数,升序排序时将小数放在前面,大数放在后面。排序算法一般都需要进行多轮比较,以下是冒泡排序的升序比较过程。
-
第 1 轮:首先比较第 1 个和第 2 个数,将小数放前,大数放后;然后比较第 2 个数和第 3 个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后;至此第一轮结束,将最大的数放到了最后。 -
第 2 轮:仍从第一对数开始比较,将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的数),第二轮结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
总结来说,第 1 到 n-1 轮中(n 为数组长度,下文同)第 i 轮的作用是把第 i 大的数放到数组的 n-i 下标处。按此规律操作,直至最终完成排序。由于在排序过程中总是将大数往后放,类似于气泡往上升,所以称作冒泡排序。
通过上面的分析可以看出,假设需要排序的序列的个数是 n,则需要经过 n-1 轮,最终完成排序。在第一轮中,比较的次数是 n-1 次,之后每轮减少 1 次。
用 Java 语言实现冒泡排序,可以用双重 for 循环实现,其程序如下。
新建一个 TestbubbleSort.java 文件,并输入以下代码。
public class TestbubbleSort {
public static void main(String[] args) {
int[] a = {12,32,13,45,34,65,76,78,89,57};
System.out.println("排序前的数据为:");
for (int a1 : a) {
System.out.print(a1+" ");
}
bubbleSort(a);
System.out.println("\n"+"排序后的数据为:");
for (int a2 : a) {
System.out.print(a2+" ");
}
}
static void bubbleSort(int[] a){
int temp;
//需要比较n-1 轮
for(int i=0;i<a.length-1;i++){
//根据a.length-i-1,每轮需要比较的次数逐轮减少一次
for(int j=0;j<a.length-i-1;j++){
//相邻数进行比较,符合条件进行替换
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
}
编译、运行此程序,结果如下图所示。
排序前的数据为:
12 32 13 45 34 65 76 78 89 57
排序后的数据为:
12 13 32 34 45 57 65 76 78 89
|