冒泡排序--Java实现

  开始从一些小的算法开始,逐渐深入学习算法和数据结构。主要依靠《算法》第四版和《图解数据结构--使用Java》。

  今天是一个引子。

  

public static void main(String[] args) {
		//冒泡排序 设定从大到小
		int [] arg = new int[]{15,9,55,52,45,98,107};
		for (int i = 0; i < arg.length-1; i++) {
			for(int j = 0; j<arg.length-i-1; j++){
			   	if (arg[j] < arg[j+1]){
			   		int temp = arg[j];
			   		arg[j] = arg[j+1];
			   		arg[j+1] = temp;
			   	}
			}
		}
		System.out.println("==========冒泡排序后的值为=========");
		for (int i = 0; i < arg.length; i++) {
			System.out.println(arg[i]);
		}
	}

  明白冒泡排序的思想,实现不是很难。外层循环使用length-1是因为最后的一个不用冒泡,里面的循环控制用length-i-1是因为要减去外层已经排过序的部分。循环体的操作是将两个位置的值对调。

  最后结果如下:

  

这个冒牌排序是一个最简单的写法,可以在这个基础上适当优化。

int [] arg = new int[]{15,9,55,52,45,98,107};
    boolean flag = true;//设置一个判断条件
	for (int i = 0; i < arg.length-1; i++) {
		for(int j = 0; j<arg.length-i-1; j++){
		   	if (arg[j] > arg[j+1]){
		   		int temp = arg[j];
		   		arg[j] = arg[j+1];
		   		arg[j+1] = temp;
		   		flag = false; //发生更改时表明经过排序
		   	}
		}
		if(flag){ //如果满足条件,则表明在这一次的循环中,没有进行过元素的变动,所有的元素都是满足要求的排序,无需进入下次循环
			break;  //每次循环实际上在越来越小的范围内进行比较
		}
	}
	System.out.println("==========冒泡排序后的值为=========");
	for (int i = 0; i < arg.length; i++) {
		System.out.println(arg[i]);
	}

在此基础上,还可以对排序边界进行优化。

int [] arg = new int[]{15,9,55,52,45,98,107};
    boolean flag = true;
    int lastExchangeIndex = 0;
    int sortBorder = arg.length - 1 ;
	for (int i = 0; i < arg.length-1; i++) {
		for(int j = 0; j < sortBorder; j++){
		   	if (arg[j] > arg[j+1]){
		   		int temp = arg[j];
		   		arg[j] = arg[j+1];
		   		arg[j+1] = temp;
		   		flag = false;
		   		lastExchangeIndex = j;
		   	}
		}
		sortBorder = lastExchangeIndex;
		if(flag){
			break;
		}
	}
	System.out.println("==========冒泡排序后的值为=========");
	for (int i = 0; i < arg.length; i++) {
		System.out.println(arg[i]);
	}

猜你喜欢

转载自blog.csdn.net/qq_32801733/article/details/80539739