Java 第5天 經典算法之冒泡排序

寫在前言:
1、現在出去面試,面試官老是會問你一句話Java 怎麼樣?
不管是大數據崗位還是數據庫都會問一句。 回來痛下決心,決定探索下這門語言的精髓,大數據很多框架也都是Java 寫的,的確懂一門語言,比較穩妥。路也寬敞!!!不然就和吃飯沒筷子,那麼尷尬。把每天學習到的 Java知識分享到這裏會。直到能自己寫個複雜一點Dome得出來。
2、爲了監督自己探索這門語言的動力與決心。特此這段話放到前面!!!
3、挑戰下自己 到底是笨 還是學不會,還是不想學。

1、原理:比較兩個相鄰的元素,將值大的元素交換至右端。

思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至全部排序完成。

第一趟比較完成後,最後一個數一定是數組中最大的一個數,所以第二趟比較的時候最後一個數不參與比較;

第二趟比較完成後,倒數第二個數也一定是數組中第二大的數,所以第三趟比較的時候最後兩個數不參與比較;

依次類推,每一趟比較次數-1;

……

舉例說明:要排序數組:int[ ] arr =new int [ ] {43,32,76,-98,0,64,66,33,-21,99};

上邊是10個元素:因爲是10個元素他會循環比較9次,最後一個值爲最大值。

第一趟排序:43,32,76,-98,0,64,66,33,-21,99

第一次排序:43和32比較,43大於32,交換位置: 32, 43,76,-98,0,64,66,33,-21,99

第二次排序:43和76比較,43小於76,不交換位置:32, 43,76,-98,0,64,66,33,-21,99

第三次排序:76,-98比較,76大於-98,交換位置:32, 43,-98,76,0,64,66,33,-21,99

第四次排序:76,0比較,76大於0,交換位置:32, 43,-98,0,76,64,66,33,-21,99

第五次排序:76,64比較,76大於64,交換位置:32, 43,-98,0,64,76,66,33,-21,99

第五次排序:76,66比較,76大於66,交換位置:32, 43,-98,0,64,66,76,33,-21,99

第六次排序:76,33比較,76大於33,交換位置:32, 43,-98,0,64,66,33,76,-21,99

第七次排序:76,-21比較,76大於-21,交換位置:32, 43,-98,0,64,66,33,-21,76,99

第八次排序:76,99比較,76小於99,不要交換位置:32, 43,-98,0,64,66,33,-21,76,99

第一趟總共進行了8次比較, 排序結果: 32, 43,-98,0,64,66,33,-21,76,99


第二趟排序:32, 43,-98,0,64,66,33,-21,76,99

第一次排序:32和43比較,32小於43,不交換位置:32, 43,-98,0,64,66,33,-21,76,99

第二次排序:43和-98比較,-98小於43,交換位置:32, -98,43,0,64,66,33,-21,76,99

第三次排序:43和0比較,43大於0,交換位置:32, -98,0,43,64,66,33,-21,76,99

“負數的定義是:任何正數前加上負號都等於負數 -(-2)這個數本身不是屬於負數概念的,只不過是(-2的相反數), 0一定比正數小,就意味着0一定比負數大,這句話是對的 ”

第四次排序:64和66比較,64小於66,不交換位置:32, -98,0,43,64,66,33,-21,76,99

第五次排序:66和33比較,66大於33,交換位置:32, -98,43,0,64,33,66,-21,76,99

第六次排序:66和-21比較,66大於-21,交換位置:32, -98,43,0,64,33,-21,66,76,99

第七次排序:76和66比較,76大於66 不交換位置:32, -98,43,0,64,33,-21,66,76,99

第八次排序:76和99比較,99大於76 不交換位置:32, -98,43,0,64,33,-21,66,76,99


依次類推下去:
每次都會推出最大值的數。
最終結果:
-98 -21 0 32 33 43 64 66 76 99

  • 由此可見:N個數字要排序完成,總共進行N-1趟排序,每i趟的排序次數爲(N-i)次,所以可以用雙重循環語句,外層控制循環多少趟,內層控制每一趟的循環次數,即
  • for(int i =0;i<arr.length-1;i++) {
    for(int j=0;j<arr.length-1-i;j++) {

冒泡排序的優點:每進行一趟排序,就會少比較一次,因爲每進行一趟排序都會找出一個較大值。如上例:第一趟比較之後,排在最後的一個數一定是最大的一個數,第二趟排序的時候,只需要比較除了最後一個數以外的其他的數,同樣也能找出一個最大的數排在參與第二趟比較的數後面,第三趟比較的時候,只需要比較除了最後兩個數以外的其他的數,以此類推……也就是說,沒進行一趟比較,每一趟少比較一次,一定程度上減少了算法的量。

用時間複雜度來說:

1.如果我們的數據正序,只需要走一趟即可完成排序。所需的比較次數C和記錄移動次數M均達到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的時間複雜度爲O(n)。

2.如果很不幸我們的數據是反序的,則需要進行n-1趟排序。每趟排序要進行n-i次比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:
  在這裏插入圖片描述

2、最終代碼實現效果:

package iwork3;

/**
 * 數組冒泡排序的實現
 */
	public class BubbleSort {
	public static void main(String[] args) {
		// 初始化動態數組
	int[] arr =new int[] {43,32,76,-98,0,64,66,33,-21,99};
	// 冒泡排序
		for(int i =0;i<arr.length-1;i++) {
				for(int j=0;j<arr.length-1-i;j++) {
		
		if(arr[j]>arr[j+1]) {
			int temp =arr[j];
			arr[j] =arr[j+1];
			arr[j+1]=temp;
				
		}
		}
		}
			// 遍歷出數組的元素值:
			for(int i=0;i<arr.length;i++) {
			 	System.out.print(arr[i]+"\t");	

	}
	}
	}

3、你的答案:最近最火熱的一首歌曲送給你。

在這裏插入圖片描述
 

【轉載註明出處,還望尊重原創 】

 

【作者水平有限,如有錯誤歡迎指正 .】

 
 
如果我的博客對你有幫助、如果你喜歡我的博客內容,請“點贊” “評論”“收藏”一鍵三連哦!聽說點讚的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章