Java-冒泡排序、插入排序、簡單選擇排序

冒泡排序

	public static void main(String[] args) {
		
	}
	/**
	 * 冒泡排序
	 * 比較相鄰的元素,如果第一個比第二個大,就交換他們兩個,把大的數沉下去,小數冒上來
	 * 依次比較直到完成
	 */
	public static void bullesort() {
		int[] array = {121, 8, 72, 95, 8, 71, 9, 28, 17, 42, 38, 46, 120};
		System.out.println(Arrays.toString(array));
		int temp;
		int count = 0;
		// 控制排序的輪數,排序次數是 array.length - 1
		for (int i = 0; i < array.length - 1; i++) {
			// 控制排序每輪的比較次數,每輪的比較次數是 array.length - i - 1
			for (int j = 0; j < array.length - i - 1; j++) {
				// 如果前一個數比後一個數大,就把它沉底,也就是交換給索引大的數
				if (array[j] > array[j+1]) {
					temp = array[j];
					array[j] = array[j+1];
					array[j+1] = temp;
				}
			}
		}
		System.out.println(Arrays.toString(array));
	}

增強版冒泡排序

	/**
	 *  增強版冒泡排序
	 *  比較相鄰的元素。如果第一個比第二個大,就交換他們兩個,把大的數沉下去,小數冒上來
	 *  增強條件flag,如果內層循環不發生交換(flag = ture)說明排序已將完成不用再進行排序
	 */
	public static void bullesortHigh() {
		int[] array = {121, 8, 72, 95, 8, 71, 9, 28, 17, 42, 38, 46, 120};
		System.out.println(Arrays.toString(array));
		int temp;
		int count = 0;
		// 判斷數組是否排序成功,如果不進行交換就已將排序完成
		boolean flag;  
		// 控制排序的輪數,排序次數是 array.length - 1
		for (int i = 0; i < array.length - 1; i++) {
			// 默認 已將排序完成,定義在這裏
			flag = true; 
			// 控制排序每輪的比較次數,每輪的比較次數是 array.length - i - 1
			for (int j = 0; j < array.length - i - 1; j++) {
				// 如果前一個數比後一個數大,就把它沉底,也就是交換給索引大的數
				if (array[j] > array[j+1]) {
					temp = array[j];
					array[j] = array[j+1];
					array[j+1] = temp;
					// 如果發生了交換說明
					flag = false;
				}
			}
			if (flag) {
				break;
			}
		}
		System.out.println(Arrays.toString(array));
	}

插入排序

	/*
	插入排序
		
    (1)原理:

  1、將指針指向某個元素,假設該元素左側的元素全部有序,將該元素抽取出來,然後按照從右往左的順序分別與其左邊的元素比較,遇到比其大的元素便將元素右移,直到找到比該元素小的元素或者找到最左面發現其左側的元素都比它大,停止;

       2、此時會出現一個空位,將該元素放入到空位中,此時該元素左側的元素都比它小,右側的元素都比它大;

  3、指針向後移動一位,重複上述過程。每操作一輪,左側有序元素都增加一個,右側無序元素都減少一個。

    (2)例子:
  待比較數據:7, 6, 9, 8, 5,1

  第一輪:指針指向第二個元素6,假設6左面的元素爲有序的,將6抽離出來,形成7,_,9,8,5,1,從7開始,6和7比較,發現7>6。將7右移,形成_,7,9,8,5,1,6插入到7前面的空位,結果:6,7,9,8,5,1

  第二輪:指針指向第三個元素9,此時其左面的元素6,7爲有序的,將9抽離出來,形成6,7,_,8,5,1,從7開始,依次與9比較,發現9左側的元素都比9小,於是無需移動,把9放到空位中,結果仍爲:6,7,9,8,5,1

  第三輪:指針指向第四個元素8,此時其左面的元素6,7,9爲有序的,將8抽離出來,形成6,7,9,_,5,1,從9開始,依次與8比較,發現8<9,將9向後移,形成6,7,_,9,5,1,8插入到空位中,結果爲:6,7,8,9,5,1

  第四輪:指針指向第五個元素5,此時其左面的元素6,7,8,9爲有序的,將5抽離出來,形成6,7,8,9,_,1,從9開始依次與5比較,發現5比其左側所有元素都小,5左側元素全部向右移動,形成_,6,7,8,9,1,將5放入空位,結果5,6,7,8,9,1。
  
	第五輪:同上,1被移到最左面,最後結果:1,5,6,7,8,9。
	 */
	/**
	 *  插入排序實思想,從第二個數開始提取出來,和它前面的數進行比較,
	 *  如果小於前一個數就把前一個向後移一個位置,直到不小於它前面數爲止,
	 *  在對應的位置插入提取值
	 */
	public static void insertSort() {
		int[] array = {121, 8, 72, 95, 8, 71, 9, 28, 17, 42, 38, 46, 120};
		System.out.println(Arrays.toString(array));
		// 存儲插入值
		int insertValue;
		
		// i 表示 將要插入數據的索引
		// 從第二個數開始,依次與前一個數進行比較,如果小於前一個數,就把前一個數的值賦值給當前數(相當於後移)
		for (int i = 1; i < array.length; i++) {
			
			// 提取將要插入數據
			insertValue = array[i];
			// j 用來存儲需要後移數據的下標
			int j;
			// 如果 j索引所在值 大於 標記值,就把 array[j] 後移一位
			for (j = i - 1; j >= 0 && array[j] > insertValue; j--) {
				array[j+1] = array[j];
			}
			// 循環結束後,j+1所在位置就是插入位置
			array[j+1] = insertValue;
		}
		System.out.println(Arrays.toString(array));
	}

簡單選擇排序

	/**
	 * 簡單選擇排序
	 * 從數組中找到最小的值,放在第一位,從剩下的數再找到最小值放到第二位,依次類推
	 */
	public static void easySelectSortHigh() {
		int[] array = {121, 8, 72, 95, 8, 71, 9, 28, 17, 42, 38, 46, 120};
		System.out.println(Arrays.toString(array));
		// 存儲最小值的索引
		int minIndex;
		// 第一個位置開始
		for (int i = 0; i < array.length; i++) {
			// 
			minIndex = i;
			// 從第 i+1 個位置開始比較
			for (int j = i + 1; j < array.length; j++) {
				// 如果 minIndex 所在值 大於 j 所在值,說明 j 位置的值比 minIndex 小
				// 就把 j 的位置 賦值給 minIndex
				// 當遍歷完 j ~~ array.length 數組就找到最小值所在下標
				if (array[minIndex] > array[j]) {
					minIndex = j;
				}
			}
			// 把最小值與第 i 個位置的值 進行交換
			int temp = array[i];
			array[i] = array[minIndex];
			array[minIndex] = temp;
		}
		System.out.println(Arrays.toString(array));
	}

插入排序參考:https://www.cnblogs.com/bjh1117/p/8335628.html

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