Java-冒泡排序


在操作數組時,經常需要對數組中的元素進行排序。接下來介紹一種非常常見的排序算法--冒泡排序。

在冒泡排序的過程中,不斷地比較數組中相鄰的元素,較小者向上浮,較大者向下沉,整個過程和水中氣泡上升的原理相似,故稱之為冒泡排序。

原理

第一步,從第一個元素開始,將相鄰的兩個元素進行比較,直到最后兩個元素完成比較。如果前面的元素比后面的元素大,則交換它們的位置。整個過程完成后,數組中最后一個元素自然就是最大值,這樣也就完成了第一趟的比較。

第二步,除了最后一個元素,將剩余的元素按照第一步的方法進行兩兩比較,這樣就可以將數組中第二大的元素放到倒數第二個位置上。

第三步,以此類推,持續對越來越少的元素重復上面的步驟,直到沒有任何一對元素需要比較為止。

總體而言,在冒泡排序中,程序的時間復雜度和空間復雜度隨着程序的執行,均呈現遞減趨勢。

代碼

public class Example32{
	public static void main(String[] args){
		int[] arr={9, 8, 3, 5, 2};
		System.out.print("冒泡排序前:");
		printArray(arr);								// 打印排序前的數組元素
		bubbleSort(arr);								// 調用排序方法
		System.out.print("冒泡排序后:");
		printArray(arr);								// 打印排序后的數組元素
	}

	// 定義打印數組方法
	public static void printArray(int[] arr){
		for(int i=0; i<arr.length; i++){				// 從第一個數組元素開始遍歷數組元素
			System.out.print(arr[i]+" ");				// 輸出數組元素,並加空格以控制格式
		}
		System.out.print("\n");							// 完成一次調用后換行
	}

	// 定義冒泡排序方法
	public static void bubbleSort(int[] arr){
		for(int i=0; i<arr.length -1; i++){				// 外層循環,控制總共需要比較的趟數
			for(int j=0; j<arr.length -i -1; j++){		// 內層循環,控制每趟需要比較的次數
				if(arr[j] > arr[j+1]){					// 比較相鄰元素
					// 以下三行代碼用於交換兩個元素
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
			System.out.print("第"+(i+1)+"輪排序后:");	// 每趟執行完后,輸出提示信息
			printArray(arr);							// 輸出本趟執行后的結果
		}
	}
}

結果

image-20220210173223918

分析

bubbleSort()方法通過一個嵌套for循環實現了冒泡排序。

其中外層循環用來控制比較的趟數,即【數組元素的個數-1】,每一趟比較,都可以確定一個元素的位置,由於最后一個元素不需要比較,因此外層循環的次數為【arr.length-1】。

內層循環用於控制每趟比較的次數,由於變量i在循環的過程中是自增的,因此程序每執行一趟,每次比較的次數遞減。

每次比較的過程中,如果前者小於后者,則交換兩個元素的位置。

在第一輪比較中,第一個元素【9】為最大值,因此它在每次比較時都會發生位置的交換,直到被放到最后一個位置。第二輪比較中,元素【8】為第二大值,比較過程和第一輪比較類似,直到被放到倒數第二個位置。循環第三輪和第四輪比較,第四輪比較完成后,數組元素已經完成了排序。

其交換過程,類似於A杯子裝了可樂,B杯子裝了雪碧,現在需要把A杯子的可樂和B杯子的雪碧互換,因此需要拿出C杯子(即臨時變量temp)。把B杯子的雪碧倒入C杯子,此時B杯子為空杯;把A杯子的可樂倒入B杯子,此時A杯子為空杯;再將C杯子的雪碧倒入A杯子;此時C杯子為空杯,A杯子為雪碧,B杯子為可樂,即完成了可樂和雪碧的互換。

圖例

image-20220210174956602

image-20220210180107342

引用

參考項 地址
文中GIF圖片引用 https://blog.csdn.net/hcz666/article/details/117810787

<- 完 ->


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM