排序算法筆記

*動圖與部分算法介紹引用自https://www.cnblogs.com/onepixel/articles/7674659.html

冒泡排序(Bubble Sort)

冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端。 

動態演示:

原理:對相鄰兩個元素進行兩兩比較,將兩者間較大(小)的交換位置

代碼演示:

package sort;
/**
 * Author:FengWenSheng
 * Date:Mar 2, 2019
 * Description:Sort02.java
 */
public class Sort02 {
	/**
	 * 冒泡排序
	 * */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/**
		 * 原理:對相鄰兩個元素進行兩兩比較,將兩者間較大(小)的交換位置
		 * 第一層for循環表示需要遍歷的元素個數
		 * 一般寫爲arr.length
		 * 但是因爲在最後第二次遍歷時,實際上已經確定了最後兩個的大小,而最後一個已經不需要再進行比較了
		 * 也可以寫爲arr.length - 1節省最後一次運算
		 * 第二層for循環遍歷相鄰的兩兩元素之間的大小
		 * 每一次循環後內循環遍歷次數減一(因爲不需要比較之前比較後排好的元素)
		 * 因爲在判斷語句中需要與後一位進行相鄰比較
		 * 因此在此基礎上需要減去1,不需要遍歷全部,也避免了數組下標超出範圍
		 * arr.length - i - 1
		 * */
		int[] arr = {3,2,5,1,4};
		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 idx = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = idx;
				}
				
			}
			
		}
		
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

}

第一層for循環表示需要遍歷的元素個數,一般寫爲(arr.length)。但是因爲在最後第二次遍歷時,實際上已經確定了最後兩個的大小,而最後一個已經不需要再進行比較了,所以也可以寫爲(arr.length - 1)節省最後一次運算

第二層for循環遍歷相鄰的兩兩元素之間的大小,每一次循環後內循環遍歷次數減一(因爲不需要比較之前比較後排好的元素),因爲在判斷語句中需要與後一位進行相鄰比較。因此在此基礎上需要減去1,不需要遍歷全部,也避免了數組下標超出範(arr.length - i - 1)

選擇排序(Selection Sort)

選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。 

動態演示:

原理:將當前元素i與i之後的每個元素進行比較,獲得最小(大)的值

代碼演示:

package sort;
/**
 * Author:FengWenSheng
 * Date:Mar 1, 2019
 * Description:Sort03.java
 */
public class Sort03 {
	/**
	 * 選擇排序
	 * */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/**
		 * 原理:將當前元素i與數組剩餘元素進行比較,獲得最小(大)的值
		 * 如第一層循環的第1次循環時,將第1個元素與第2,3...n個元素進行比較,並交換獲得每次比較的最小(大)值
		 * 這時第一個元素的爲數組中最小(大)的一個,直至所有元素排列完畢
		 * 而實際上排列至最後第二個時,最後一個元素位置已經可以確定,因此可以將第一層循環的arr.length改寫爲arr.length - 1
		 * 第一層循環爲遍歷的元素個數
		 * 第二層循環用於比較數組中最小(大)的一個元素
		 * 因爲是從第i個元素與i後面的元素進行比較,遍歷時j = i + 1,
		 * */
		int[] arr = {2,4,1,3};
		for (int i = 0; i < arr.length - 1; i++) {
			
			for (int j = i + 1; j < arr.length; j++) {
				
				if (arr[i] > arr[j]) {
					int idx = arr[i];
					arr[i] = arr[j];
					arr[j] = idx;
				}
				
			}

		}
		
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

}

如第一層循環的第1次循環時,將第1個元素與第2,3...n個元素進行比較,並交換獲得每次比較的最小(大)值,這時第一個元素的爲數組中最小(大)的一個,直至所有元素排列完畢。而實際上排列至最後第二個時,最後一個元素位置已經可以確定,因此可以將第一層循環的arr.length改寫爲arr.length - 1。第一層循環爲遍歷的元素個數,第二層循環用於比較數組中最小(大)的一個元素,因爲是從第i個元素與i後面的元素進行比較,遍歷時j = i + 1

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