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;
	}	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章