Java与算法之(1) - 冒泡排序

原创 2016年08月29日 21:35:15

冒泡排序法的原理是,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。

例如对4 3 6 2 7 1 5这7个数字进行从小到大的排序,从最左侧开始,首先比较4和3


因为是从小到大排序,4和3的顺序显然是错误的,交换他们,得到


接下来比较4和6


顺序是正确的,不需要任何操作。接下来进行下一步,比较6和2


6显然应该排在2的后面,怎么办?交换它们,得到


经过前面几步,已经可以总结出规律,那么接下来要做的比较依次是:

7 > 1? 得到 3 4 2 6 1 7 5

7 > 5? 得到


到此,7的右边已经没有数可以比较,第一轮排队结束。经过这一轮,已经成功的把最大的数,即7放在了最后。但是前面6个数的顺序还是不对,但是按照上面的思路很容易想到,对前面6个数再来一遍,即可把6放到倒数第二的位置。然后再对前面5个数重复逐个比较的步骤。。。

7个数字需要进行7-1=6次排队,每完成一轮排队,下一轮排队需要比较的数字个数减1,来看代码

public class BubbleSort {
	public void sort(int... numbers) {
		//n个数执行n-1轮
		//每一轮后完成一个数字归位, 下一轮要比较的数字个数减1(所以内层循环是j < n - i)
		int n = numbers.length - 1;
		int t;
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n - i; j++) {
				if(numbers[j] > numbers[j + 1]) {
					t = numbers[j];
					numbers[j] = numbers[j + 1];
					numbers[j + 1] = t;
				}
			}
		}
	}
}
测试

	public static void main(String[] args) {
		int[] numbers = new int[]{ 4, 3, 6, 2, 7, 1, 5 };
		System.out.print("before: ");
		for(int i = 0; i < numbers.length; i++) {
			System.out.print(numbers[i] + "  ");
		}
		System.out.println();
		new BubbleSort().sort(numbers);
		System.out.print("after: ");
		for(int i = 0; i < numbers.length; i++) {
			System.out.print(numbers[i] + "  ");
		}
		System.out.println();
	}
输出

before: 4  3  6  2  7  1  5  
after: 1  2  3  4  5  6  7  

冒泡排序的核心是两层嵌套的循环,时间复杂度是O(N^2),即对N个数排序,需要近似执行N的平方次。因为效率较低,实际开发中基本不会使用,但是因为简单易懂通常做为学习算法的入门案例。

如果用上面的代码对1 2 3 4 5 6 7做从小到大排列,会发现虽然数字已经排列好,但是程序还是要忠实的执行完全部两层循环。对这种情况,我们可以引入一个变量来记录一次内层循环中交换数字的个数,如果交换个数为0,则提前终止循环,在某些情况下可以提高效率。

	public void betterSort(boolean descend, int... numbers) {
		System.out.print("before: ");
		for(int i = 0; i < numbers.length; i++) {
			System.out.print(numbers[i] + "  ");
		}
		System.out.println();

		//n个数执行n-1轮
		//每一轮后完成一个数字归位, 下一轮要比较的数字个数减1(所以内层循环是j < n - i)
		int n = numbers.length - 1;
		int t;
		int flag = 0;
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n - i; j++) {
				if(descend) { //从大到小
					if(numbers[j] < numbers[j + 1]) {
						t = numbers[j];
						numbers[j] = numbers[j + 1];
						numbers[j + 1] = t;
						flag = 1;
					}
				} else {
					if(numbers[j] > numbers[j + 1]) {
						t = numbers[j];
						numbers[j] = numbers[j + 1];
						numbers[j + 1] = t;
						flag = 1;
					}
				}
			}
			if(flag == 0) {
				break;
			} else {
				flag = 0;
			}
		}
		System.out.print("after: ");
		for(int i = 0; i < numbers.length; i++) {
			System.out.print(numbers[i] + "  ");
		}
		System.out.println();
	}
增加一个变量需要额外占用内存空间,因此,这个方法是以空间换时间。

版权声明:欢迎转载, 转载请保留原文链接。

排序算法之(1)——冒泡排序

**【冒泡排序的思想】** 冒泡排序总共进行n-1趟,每一趟扫描总是通过两两比较把大的往后放,所以第一趟即把最大数放在最后面,接着第二趟把第二大数放在倒数第二的位置………….到n-1完成,此时只有一...
  • adminabcd
  • adminabcd
  • 2015年06月06日 10:11
  • 819

[排序算法]--冒泡排序的三种实现(Java)

冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。 设数组的长度为N: (1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。(2)这样...
  • u010853261
  • u010853261
  • 2017年02月06日 12:53
  • 3321

冒泡排序算法 Java 实现过程及详解

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已...
  • youcharming
  • youcharming
  • 2014年12月25日 23:23
  • 3357

Java算法实现之冒泡排序及优化

Java算法实现之冒泡排序及优化
  • a445849497
  • a445849497
  • 2017年02月14日 15:14
  • 417

java编程题:用Java实现一个冒泡排序算法

/** * java编程题:用Java实现一个冒泡排序算法 */ public class Test { public static void main(String[] args) { ...
  • min996358312
  • min996358312
  • 2017年03月21日 16:07
  • 2121

排序算法之冒泡排序的思想以及Java实现

1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称它...
  • whq19890827
  • whq19890827
  • 2016年08月14日 21:12
  • 1378

Java List集合冒泡法排序的两种实现

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已...
  • u013751758
  • u013751758
  • 2014年11月10日 20:49
  • 2205

java 冒泡排序算法优化

在文章《》
  • yyywyr
  • yyywyr
  • 2014年08月04日 22:36
  • 3885

Java排序算法之冒泡排序和选择排序

前言:纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。——泰戈尔 《飞鸟集》 原文出处: import java.util.Arrays; class Demo { public...
  • u014158743
  • u014158743
  • 2016年09月19日 23:14
  • 617

java中的三种排序算法详解(直接选择.冒泡.插入)

package lianxi;public class Sort {public static void main(String args[]){int[] a = {2,15,9,7,36,16,1...
  • nana129
  • nana129
  • 2014年08月10日 18:56
  • 907
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java与算法之(1) - 冒泡排序
举报原因:
原因补充:

(最多只允许输入30个字)