算法之美-冒泡排序


   1、为什么叫冒泡排序:

         现在回过头来学算法,总会问自己一些奇怪的问题。

         比如为什么叫冒泡呢?为什么不叫冒烟呢? 哈哈,有时自己想想都搞笑。

        上网查了查,这么起名是有道理的,就像水里的气泡一样,大的气泡会最先出来。

        越大的元素会经常交换慢慢的“浮”到数列的顶端,当然这是从大到小排序,还有从小到大呢。


  2、 冒泡排序的原理描述(从大到小):

         1、重复遍历无序的数列。

         2、依次比较相邻的两个元素,将关键字大的元素移到前面,小的移到后面,也就是大小互换位置。

         3、这样每经过一趟过排序后,关键字最大的元素就会移到最前面,此时绩效该元素的位置。

         4、下一趟只需要比较到此位置为止。直到整个序列有序为止。


 3、下面结合代码分析一下:

        网上有好多不是严格意义上的冒泡排序算法,也不知道是否拿来测试没有。

       比如看看下面所谓冒泡排序,功能确实能实现,但我们分析分析看哪里有瑕疵。

package BubbleSort;

/*
 * 冒泡排序 从大到小排序
 * 2016年7月22日15:00:46
 * 唐凌峰
 */
public class BubbleSort1 {
	
	/* 从大到小排序
	 * 这样的排序是: 在内循环从j=2开始 ,比较的不是相邻的元素了,比较的间隔元素。
	 * 虽然能实现从大到小的排序,但个人认为没有严格 按照冒泡排序 原理来实现,你可以说是改良版或不是标准版的吧
	 */
	public void bubbleSortTest(){
		int bubble[] ={8,18,4,78,11,56,88,99};
		for(int i=0;i<bubble.length;i++){
			for(int j=i+1;j<bubble.length;j++){
				//比较相邻两个元素的大小,其实这么比较的不是相邻的两个元素,
				if (bubble[i] < bubble[j]){
					int temp =bubble[i];
					bubble[i]=bubble[j];
					bubble[j]=temp;
				};							
			} 
		};
		
		//打印出排序好的数组	
		for(int i=0;i<bubble.length;i++){
			System.out.println("Index: "+i+"  value: "+bubble[i]);
		}
	}
	
	public static void main(String[]  args){
		BubbleSort1  bubbleSort= new BubbleSort1();
		bubbleSort.bubbleSortTest();
	}

}

    就像注释里写的,当外循环 i=0 的时候,内循环得循环j=i+1从1循环到7吧!

   这就意味着:当外循环是i=0时,内循环j=2时 ,比较的数是bubble[0]<bubble[2],比的是18<4 这两个元素。

             同理 :当 外循环是i=0时,内循环j=3时,比较的数是bubble[0]<bubble[3],比较的是18<78这两个元素

   虽然每经过依次比较,较大的元素慢慢移动到了前面去了,但是没有遵守冒泡排序原理来。

   比较的元素:必须是相邻元素。 上面的demo 比较的元素显然不是相邻的元素。

  

   下面再看看比较的是相邻的元素的demo吧(从大到小排序)

    

package BubbleSort;

/*
 * 冒泡排序 从小到大排序
 * 2016年7月22日15:00:46
 * 唐凌峰
 */
public class BubbleSort2 {
	/*
	 * 从小到大排序  如何让这个算法实现转换成 从大到小呢? 其实很简单 
	 */
	public void bubbleSortTest(){
		int bubble[] ={8,18,4,78,11,96,88,99};
		for(int i=0;i<bubble.length;i++){
			for(int j=0;j<bubble.length-i-1;j++){
				//比较相邻两个元素的大小,一定要相邻元素比较,为什么原理就只这样的。
				if (bubble[j+1]>bubble[j]){
					int temp =bubble[j];
					bubble[j]=bubble[j+1];
					bubble[j+1]=temp;
				};								
			} 
		};
		//打印出排序好的数组				
		for(int i=0;i<bubble.length;i++){
			System.out.println("Index: "+i+"  value: "+bubble[i]);
		}
	}
	
	public static void main(String[]  args){
		BubbleSort2  bubbleSort= new BubbleSort2();
		bubbleSort.bubbleSortTest();
	}

}

这个demo 为什么能做到 比较的一定是相邻的元素,妙就妙在 内循环的循环控制表达式:j<bubble.length-i-1。

如果我想从让排序从小到大这么办呢? 很简单 把内循环的if语句里的大于号改成小于号就行了。可以试试。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值