冒泡排序的基础算法及优化

冒泡排序是最常用的排序算法,在笔试中也非常常见,那么何为冒泡排序呢?通俗的来说就是一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。

1.原理:比较两个相邻的元素,将值大的元素交换到右边

2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。

(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。

(2)比较第2和第3个数,将小数 放在前面,大数放在后面。

(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成

(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。

(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。

(6)依次类推,每一趟比较次数减少依次
    
我们通过一个简单的例子来说明:

3, 1, 6, 2, 9, 0, 7, 4, 5, 8 初始序列
1, 3, 6, 2, 9, 0, 7, 4, 5, 8 第一次
1, 3, 6, 2, 9, 0, 7, 4, 5, 8 第二次
1, 3, 2, 6, 9, 0, 7, 4, 5, 8 第三次
1, 3, 2, 6, 9, 0, 7, 4, 5, 8 第四次
1, 3, 2, 6, 0, 9, 7, 4, 5, 8 第五次
1, 3, 2, 6, 0, 7, 9, 4, 5, 8 第六次
1, 3, 2, 6, 0, 7, 4, 9, 5, 8 第七次
1, 3, 2, 6, 0, 7, 4, 5, 9, 8 第八次
1, 3, 2, 6, 0, 7, 4, 5, 8, 9 第九次

这样一次的循环就可以找到最大的数9,并将它放在最后一位,所以我们可以再到外面套一个循环,依次找到当次循环最大的值。

import java.util.Arrays;

public class TestBubbleSort {
	public static void main(String[] args) {
		int[] values = {3,1,6,2,9,0,7,4,5,8};
		int temp = 0;
		for(int i=0;i<values.length-1;i++) {
			for(int j=0;j<values.length-1-i;j++) {
				//比较大小,换顺序
				if(values [j] > values[j+1]) {
					temp = values[j];
					values [j] = values[j+1];
					values [j+1] = temp;
				}
				System.out.println(Arrays.toString(values));
			}
			System.out.println("#####");
		}
	}

}

但是有一点需要我们注意:
冒泡排序的基础算法及优化_第1张图片
我们看到其实序列已经排序好了,但是程序还没有执行完毕,所以为了避免重复,我们对该算法进行优化,我们对整个大循环序列如果都没有发生交换,那么我们就确定序列已经排序好了,就退出循环。

public class TestBubbleSort {
	public static void main(String[] args) {
		int[] values = {3,1,6,2,9,0,7,4,5,8};
		int temp = 0;
		for(int i=0;i<values.length-1;i++) {
			boolean flag = true;
			for(int j=0;j<values.length-1-i;j++) {
				//比较大小,换顺序
				if(values [j] > values[j+1]) {
					temp = values[j];
					values [j] = values[j+1];
					values [j+1] = temp;
					flag = false;
				}
				System.out.println(Arrays.toString(values));
			}
			if(flag) {
				System.out.println("结束!");
				break;
			}
			System.out.println("#####");
		}
	}
}

也希望大佬多多指教,小生有礼了!

你可能感兴趣的:(Java)