1. 程式人生 > >Java學習第14天—陣列高階應用—比較排序及其優化

Java學習第14天—陣列高階應用—比較排序及其優化

 比較排序

比較排序:compare(選擇排序:select)

原理:依次拿某個位置上的元素和其後的所有元素比較,大的放後邊,每次確定的就是此位置上的元素.比較的趟數是元素個數減1

package com.nim.sort;

/*
 * 比較排序及其優化
 */
public class SelectSortDemo {

	public static void main(String[] args) {
		int[] arr = getArray();
		System.out.println("排序前");
		print(arr);

		int[] arr2 = copyArray(arr);
		System.out.println("排序前");
		print(arr2);
		
		System.out.println("----------------");
		selectSort(arr);
		System.out.println("排序後");
		print(arr);
		
		selectSort2(arr2);
		System.out.println("排序後");
		print(arr2);
	}

	// 複製一個數組
	public static int[] copyArray(int[] arr) {
		int[] arr2 = new int[arr.length];
		for (int i = 0; i < arr.length; i++) {
			arr2[i] = arr[i];
		}
		return arr2;
	}

	// 生成一個元素個數為1000的隨機陣列
	public static int[] getArray() {
		int[] arr = new int[1000];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random() * 1000 + 1);
		}
		return arr;
	}

	// 列印方法
	public static void print(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			if (i != 0 && i % 100 == 0) {
				System.out.println();
			}
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}

	// 比較排序(選擇排序)
	public static void selectSort(int[] arr) {
		// 外層迴圈控制比較的輪數,固定值元素個數-1
		int count = 0;
		for (int i = 0; i < arr.length - 1; i++) {
			// 內層迴圈控制的是兩兩比較的次數
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[i] > arr[j]) {
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
					count++;
				}
			}
		}
		System.out.println("優化前的比較排序交換的次數是:" + count);
	}

	// 優化比較排序
	public static void selectSort2(int[] arr) {
		// 外層迴圈控制比較的輪數,固定元素個數-1
		int count = 0;
		for (int i = 0; i < arr.length - 1; i++) {
			// 先記錄確定位置上的索引和值
			int index = i;
			int value = arr[i];
			// 找到除了確定索引位置之外的元素最小值
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[j] < value) {
					index = j;
					value = arr[j];
				}
			}
			// 確定是否有必要交換兩個位置的值
			if (index != i) {
				int temp = arr[i];
				arr[i] = arr[index];
				arr[index] = temp;
				count++;
			}
		}
		System.out.println("優化後的比較排序交換的次數是:" + count);
	}
}

氣泡排序:

第一輪排序:確定陣列最後位置上的元素。兩兩比較大的往後移;第二輪排序:確定陣列倒數第二位置上的元素。兩兩比較,大的往後移。其他位置上的元素以此類推排序

比較的輪數為元素個數減1,(剩最後一個位置,只有一個元素,不需要比較了)每輪中兩兩比較的次數逐漸遞減

使用迴圈的巢狀

外層迴圈控制比較的輪數 次數固定 元素個數減1

內層迴圈控制每輪比較中兩兩交換的次數

比較排序(選擇排序)

第一輪排序:確定陣列第一個位置上的元素,用第一個和後面的比,誰小誰放在第一個位置,再用第一個位置的數和後後面的比,再把小的放在第一個.......

第二輪排序:確定陣列第二個位置上的元素,和第一輪一樣的比較方法。。。。。。

比較輪數 :元素個數減1

使用迴圈巢狀 外層迴圈控制比較的輪數,次數固定元素個數減1

內層迴圈控制的是當前位置和其後所有元素進行比較的次數,開始值隨著輪數增加,結束值始終是最後一個元素。

比較排序的優化  確定某個元素時,有可能交換多次

優化 先把要確定的某個位置的索引和值記錄下來

然後確定剩下元素的最小值,再和記錄的值比較看是否需要交換,如果比確定的值小,就交換。