1. 程式人生 > >Java實現八大排序之一

Java實現八大排序之一

1.選擇排序

先來說一下選擇排序的基本思想:從陣列的第一個數開始,將它與後面的每個數進行比較,如果比它小,就交換這兩個數。這樣一遍下來便可以找出最小的數了;接著從第二個數開始,重複第一個步驟。直到最後一個數,這樣就完成了陣列元素的排序。文字太抽象,上圖吧。


	/**
	 * 選擇排序
	 * @param arr
	 * 
	 */
	public void selectSort(int[] arr) {
		int n = arr.length;
		for (int i = 0; i < n; i++) {
			for (int j = i + 1; j < n; j++) {
				if (arr[i] > arr[j]) {
					swpe(arr, i, j);
				}
			}
		}

	}

	/**
	 * 交換陣列兩個位置的值
	 * @param arr
	 * @param index1
	 * @param index2
	 */
	public static void swpe(int[] arr, int index1, int index2) {
		int temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}
2.氣泡排序

氣泡排序是兩個相鄰之間的數進行比較,0號元素與1號元素比較,1號元素與2號元素比較,以此類推。在比較的過程中,如果前面的數比後面的大,則交換兩個數的位置。這樣每輪下來都可以找到一個最大的數。迴圈完N(陣列元素的個數)次之後完成排序。

	/**
	 * 氣泡排序
	 * 
	 * @param arr
	 */
	public static void bubbleSort(int[] arr) {
		if (arr == null || arr.length == 0) {
			return;
		}
		int last = arr.length;
		int pos = 0;
		while (last != 0) {
			for (int i = 0; i < last - 1; i++) {
				if (arr[pos] > arr[pos + 1]) {
					swpe(arr, pos, pos + 1);
				}
				pos++;
			}
			pos = 0;
			last--;
		}
	}

	/**
	 * 交換陣列兩個位置的值
	 * @param arr
	 * @param index1
	 * @param index2
	 */
	public static void swpe(int[] arr, int index1, int index2) {
		int temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}

3.插入排序

插入排序基本思想:將整個待排序的陣列看成左右兩部分,其中左邊為有序去,右邊為無序區,整個排序過程就是將右邊無序區中的元素逐個插入到左邊的有序區中,已構成新的有序區。

比如說 3,1,5,9,7;首先將第一個元素作為劃分點,接著將右邊的數插入到左邊去,如果能插到左邊去的數已經全部完成,那麼將劃分點向右推移。3首先作為劃分點,從3的後面第一個數開始,將旗標設定為該數,檢查是否可以插入到左邊去,則將它所在位置前面的數後移。然後將該數插入到它所應該在的位置。插入完畢之後將劃分點向右推移。只有1需要移到左邊,將3向右移動,騰出位置,1插入到3前面。接著3後面的5作為劃分點,繼續插入邏輯。直到最後一個元素,完成排序。

/**
	 * 插入排序
	 * @param arr
	 */
	public static void insertSort(int[] arr) {
		/**
		 * 形成一個新的陣列,用0號元素作為監崗哨
		 */
		int newLength = arr.length + 1;
		int[] newArr = new int[newLength];
		for (int i = 0; i < arr.length; i++) {
			newArr[i + 1] = arr[i];
		}

		for (int i = 2; i < newLength; i++) {
			// 設定旗標
			newArr[0] = newArr[i];
			// j指向前一個元素
			int j = i - 1;
			// i位置的元素要找到插入的位置,如果可以插入,則將插入位置後面的元素後移,騰出插入位置
			while (newArr[j] > newArr[0]) {
				newArr[j + 1] = newArr[j];
				j = j - 1;
			}

			newArr[j + 1] = newArr[0];
		}

		for (int i = 0; i < arr.length; i++) {
			arr[i] = newArr[i + 1];
		}
	}