冒泡排序以及优化

冒泡排序的基础算法
冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是基本素养.
其基本思想是重复的进行整个数组的排序,比较相邻的元素。如果第一个比第二个大就交换他们两个,然后第二个和第第三个相比较,如果前者较大就交换之,否则就不交换,然后又是比较第三个和第四个比较,不断重复,直到找到这个数组中最大的元素,找到最大的元素后删掉,从剩下的元素中,重复这些步骤直到没有任何一对数字需要比较,然后把找到的最大的数按先后顺序存放起来并输出,就是我们所看到的从大到小排序好的数组;
因为它就好像气泡一样,轻的气泡会往上漂浮,在不断漂浮的过程中,发生了两两交换过程,所以叫冒泡排序。
冒泡排序的算法运作如下:
1.比较相邻的元素。如果第一个比第二个大就交换他们两个;
2.对每一对相邻的元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

应对面试排序的口诀记忆法:

N个数字来排序,

两两比较小靠前;

外层循环n-1,

内层循环n-1-i;
package cn.sxt.array2;

import java.util.Arrays;

/**
 * 测试冒泡排序以及优化
 * @author *佳林
 *
 */
public class TestBubbleSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] values = {3,1,2,10,9,0,7,4,5,8};
		int temp = 0;
			for(int i=0;i<values.length-1;i++) {//因为有j++,索引时会加一,所以要j<values.length-1,使得j++不得超过values.length(即values数组的长度)
				//外层循环把剩下的元素中最大的元素找出来
				boolean flag = true;//判断循环是否已排好
				for(int j=0;j<values.length-1-i;j++) {//values.length-1-i外部没循环一次,内部就少循环一次。
					//内层循环找出原数组最大元素
					//比较大小,换顺序
					if(values[j]>values[j+1]) {//判断条件(比大小),j最大值是9,如果当比较到第9个数时即j=9,对应的values[j+1=10],而values数组下标的最大值是9,就会抛出数组下标越界的异常
						
						temp = values[j];//先把数组values索引为i对应存放的数值(或元素)存入到变量temp中
						values[j] = values[j+1];//再把数组values索引为j+1处对应存放的数值,存储到其索引为j的地方
						values[j+1] = temp;//最后,把temp存储的值存放到数组values索引为j+1的地方。这样就实现了交换顺序
						
						flag = false;//如果数组元素发生交换说明该数组还没有完全排完
					}
				System.out.println(Arrays.toString(values));//每比较一次就打印出这个数组
				}
				if(flag) {//如果flag=true
					System.out.println("排序结束!!!");
					break;//如果整个内层循环中没有数组的元素发生交换就说明已经排完了,就跳出外层循环
				}
			System.out.println("-------------------");	
		}
	}

}

运行效果:
在这里插入图片描述
在这里插入图片描述
可能代码中的注释比较多,但也是为了便于理解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值