冒泡排序算法是所有排序算法中最简单、最基础的一种。冒泡排序算法的思路就是交换排序,通过相邻数据的交换来达到排序的目的。
冒泡排序算法
冒泡排序算法通过多次比较和交换来实现排序,其排序流程如下:
- 对数组中的各数据,依次比较相邻的两个元素的大小。
- 如果前面的数据大于后面的数据,就交换这两个数据。经过一轮的多次比较排序后,便可将最大的数据排好。
- 在用同样的方法把剩下的数据逐个进行比较,最后便可按照从小到大的排序排好数组各数据。
为了更好的理解冒泡排序算法的执行过程,下面举一个实际的例子来一步一步的执行冒泡排序算法。对于6个整形数据52、23、18、84、58、11,这是一组无序的数据。对齐执行排序效果如下所示。
从上面的例子可以非常直观地了解到冒泡排序算法执行过程。整个排序过程就像水泡的浮起过程,故此而得名。冒泡排序算法在对n个数据进行排序時,无论原数据有无序,都需要进行n-1步的中间排序。这种排序方法思路简单直观,但是缺点是执行的步骤稍长,效率不高。
一种改进的方式,即在每次中间排序之后,比较一下数据是否已经按照顺序排列完成,否则继续进行冒泡排序。这样可以加速算法的执行过程。
冒泡排序算法实例
根据上面的基本的思想,我们来动手写一个例子说明冒泡排序在排序中的应用。
package Bubble;
public class BubbleAlgorithm {
public static void bunnle(int[] a){
int temp;
for (int i = 1; i < a.length; i++) {
for (int j = 0; j < a.length-1; j++) {
if (a[j] > a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j] = temp;
}
}
System.out.print("第"+i+"步排序结果:");
for (int k = 0; k < a.length; k++) {
System.out.print(" "+a[k]);
}
System.out.println("\n");
}
}
public static void main(String[] args) {
int[] aa = {196,182,123,104,111,106,185,194,192,159};
System.out.print(" 初始值:");
for (int i = 0; i < aa.length ; i++) {
System.out.print(" "+aa[i]);
}
System.out.println("\n");
bunnle(aa);
}
}
运行结果如下:
初始值: 196 182 123 104 111 106 185 194 192 159
第1步排序结果: 182 123 104 111 106 185 194 192 159 196
第2步排序结果: 123 104 111 106 182 185 192 159 194 196
第3步排序结果: 104 111 106 123 182 185 159 192 194 196
第4步排序结果: 104 106 111 123 182 159 185 192 194 196
第5步排序结果: 104 106 111 123 159 182 185 192 194 196
第6步排序结果: 104 106 111 123 159 182 185 192 194 196
第7步排序结果: 104 106 111 123 159 182 185 192 194 196
第8步排序结果: 104 106 111 123 159 182 185 192 194 196
第9步排序结果: 104 106 111 123 159 182 185 192 194 196
图中显示了每一步排序的中间结果。从中可以看出第5步之后便已经完成对数据的排序,但是算法仍然需要进行后续的比较步骤。根据上面介绍的思路,加入判断部分,使之能够尽早结束排序过程,从而提高程序的执行效率。调优方法如下:
package Bubble;
public class BubbleAlgorithm {
public static void bunnle(int[] a){
int temp;
//定义
int fay = 0;
for (int i = 1; i < a.length; i++) {
for (int j = 0; j < a.length-1; j++) {
if (a[j] > a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
System.out.print("第"+i+"步排序结果:");
for (int k = 0; k < a.length; k++) {
//开始
if (a.length-2 >= k){
if (a[k]>a[k+1]){
fay = 1;
}
}
//结束
System.out.print(" "+a[k]);
}
//开始
if (fay == 0){
break;
}else {
fay = 0;
}
//结束
System.out.println("\n");
}
}
public static void main(String[] args) {
int[] aa = {196,182,123,104,111,106,185,194,192,159};
System.out.print(" 初始值:");
for (int i = 0; i < aa.length ; i++) {
System.out.print(" "+aa[i]);
}
System.out.println("\n");
bunnle(aa);
}
}
输出结果如下:
初始值: 196 182 123 104 111 106 185 194 192 159
第1步排序结果: 182 123 104 111 106 185 194 192 159 196
第2步排序结果: 123 104 111 106 182 185 192 159 194 196
第3步排序结果: 104 111 106 123 182 185 159 192 194 196
第4步排序结果: 104 106 111 123 182 159 185 192 194 196
第5步排序结果: 104 106 111 123 159 182 185 192 194 196