Java七武器----排序算法之冒泡排序
有人会说编程枯燥乏味毫无乐趣,我想说如果你认为编程没意思那至少能说明你初高中的物理数学很一般,如果你在初高中能从物理数学中窥见精妙绝伦的艺术之美,那么编程对你来说就是一件极其享受的事情。从今天起,我会用我的艺术性和创造性带大家认识下“老黄”笔下的十大排序算法。互联网丰富多彩但找到有价值的东西却有如大海淘金,还请大家支持原创禁止盗用篡改,且行且珍惜。
接力赛原理
在讲冒泡排序的时候我觉得必须要提到的就是接力赛原理,我们知道接力赛不是一个人完成的而是几个人组成一个小队,然后小队成员间通过传递接力棒最终完成比赛全程。这就好比古时候的驿站,每个驿站都有新的马匹和骑手,通过接力最终将信件传递给指定方。冒泡排序和这二者有什么联系呢?很简单,接力赛传的是接力棒,驿站传的是信件,而我们的冒泡排序传的则是最大值,规定区间内的最大值。当你将所有区间的最大值都传递到最右方的时候,从右往左来看就是由大到小的倒序排列,也就是我们所谓从左到右的顺序排列。
局部最大化的宏观传递
高中学习物理的时候在讲光的波粒二象性时我曾经一度兴奋不已,我能深切体会到19世纪面对光的这一诡异特性科学家们复杂的心情,我当时甚至认为理论应该分为宏观连续真理以及微观间接特性,这些东西就好比数学中的概率论,化学中的熵,机械波的原理以及波尔提出的原子物理中的量子模型一样,不可思议却又真真实实出现在你的眼前让你无法推翻。冒泡排序的微观行为是相邻元素的大小比较,宏观表现则是传递局部区间的最大值,理解了这句话你就真正抓住了冒泡排序的本质。
从代码实现看“假借于物”思想
接下来是冒泡排序的Java实现,从具体的代码中一起体会下他的实现细节以及底层原理:
class ArithmeticUtil{
public static int[] getRankData(int[] originalData){
if(originalData.length==0)
return originalData;
for(int i=0;i<originalData.length;i++){
for(int j=0;j<originalData.length-1-i;i++){
if(originalData[j]>originalData[j+1]){
//数据交换假借于物
int temp=originalData[j];
originalData[j]=originalData[j+1];
originalData[j+1]=temp;
}
}
}
return originalData;
}
}