冒泡排序

“冒泡”,顾名思义,气泡在水中时,由于重力(你也可以说是浮力)作用,从水底向水面浮去。

所谓的“冒泡排序”,就是将数组的相邻数字进行比较,将“较轻”的数字置换到数组的”上方“,将”较重“的数字置换到数组是”下方“,比如对一组数(假如以从小到大的顺序对数组进行排序):

3,1,6,9,0

进行了第一趟的比较操作之后,数组的顺序就变为了:

1,3,6,0,9

在这一过程中,‘3’先和‘1’进行比较,(因为是升序排序)‘3’比‘1’”重“,于是两数字发生位置互换,1,3,6,9,0,‘3’来到了第二个位置。接下来,它继续和下一个数字‘6’进行比较。此时‘3‘比’6‘”轻“,位置不变,‘3’将主动权交给了‘6’,于是‘6’便和下一个数字‘9’进行比较,此时显然遇到了刚才‘3’与‘6’比较时同样的情况,‘6’依然比‘9’”轻“。于是乎,’6‘只能又将主动权交给’9‘。’9‘按规则仍要和其后的’0‘进行比较,孰”轻“孰”重“就不用多说了,1,3,6,0,9 应运而生,’9‘作为”最重“的数字,被沉到了”最底“。

进行过第二趟的比较操作之后,数组的顺序又变为了:

1,3,0,6,9

’6‘作为前四个数中”最重“的数字,又沉到了”最底“(相对于前四个数的最底,因为第一趟中,已经沉淀出了本数组中的最大数‘9’)。以此类推,再将前3个数中最大的数沉底(1,0,3,6,9),再将前两个数中的最大数沉底(0,1,3,6,9),升序排序结束。降序也是一样的道理,只需依次向后比较”较轻“的数字即可。

原始算法

以下为Java代码的算法片段:

public static void bubbleSort(int[] arr){            //bubble sort the random array arr[]
		for(int i=0;i
   
   
    
    arr[j+1]){              //if arr[j] is "heavier" than arr[j+1] 
					swap(arr,j,j+1);              //exchange each other's value
				}
			}
		}
}

   
   
你会发现,不管数组排序前的顺序怎样,这段代码都会进行(1+2+3....+arr.length-1)次循环。例如我想对数组{1,2,3,4,5},进行升序排序,排序前,数组的顺序很显然就已经是升序了,可以这段代码还会做白白循环20次的无用功,大大降低了代码性能。

改进算法(一)

我们可以用标志位对冒泡算法进行改进,这里所谓的标志位并没有什么特殊的意义,它就相当于一个开关,控制着循环的走向。

public static void bubbleSortImproved(int[] arr){       //改进的冒泡排序法
	boolean needNextPass = true;
	for(int i=0;i
    
    
     
     arr[j+1]){                        //则将标志位置为true;如果没有发生交换,则说明
				swap(arr,j,j+1);                        //数组当前的顺序已经符合排序要求,没有必要再进行
				needNextPass = true;                    //后面的排序了,循环的使命完成,数组排序结束。
			}
		}
	}
}

    
    


未完待续~~

reference:
        1.《java语言程序设计(进阶篇)》(第八版) Y.Daniel Liang 著,李娜 译 (P71~P73)
        2.“物有所不足,智有所不明”的博客:http://www.cnblogs.com/FlyingBread/archive/2007/01/26/630674.html

/*
  1.本文为原创技术文章,首发CSDN个人站点(http://blog.csdn.net/u011429947)。
  2.所做文章仅用于相互学习和交流,转载请注明作者及出处。
  3.由于个人能力有限,错误之处在所难免,如能指出,非常感谢。
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值