1. 程式人生 > >java 陣列排序

java 陣列排序

選擇排序

將要排序的一組數字進行遍歷。
第一次遍歷,將第一個位置上的數字與後面的數字進行比較,如果後面的數字比第一個位置上的元素小,則將兩個數字的位置進行交換。
第二次遍歷,將第二個位置上的數字與後面的數字進行比較,如果後面的數字比第二個位置上的元素小,則將兩個數字的位置進行交換。
依次進行遍歷、位置交換,直到這組數字排序完成。
假設要遍歷數字的個數是n,則需要遍歷的次數是n-1

public static void selectSort(int[] arr) {
		int temp;
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = i + 1; j < arr.length; j++) {
                        //每次arr[i]和剩下的所有arr[j]依次比較
				if (arr[i] > arr[j]) {
					temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
				}
			}

		}
	}

 氣泡排序:

將要排序的一組數字進行遍歷。
第一次遍歷,將相鄰的兩個數字進行比較,直到這組數字全部比較完成,如果前面比後面的數字大,則進行交換位置,此時可以將最大的數字篩選出來,放到最後的位置上。也可以將最小的數字篩選出來放到最後一個位置上.
第二次遍歷,將相鄰的兩個數字進行比較,直到這組數字全部比較完成,如果前面比後面的數字大,則進行交換位置,將這組數字裡面第二大的數字篩選出來,放到倒數第二的位置上。
依次進行遍歷,交換位置,直到排序完成。

 

public static void bubbleSort(int[] arr) {
		int temp;
		/*
		 * for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length -
		 * 1- i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1];
		 * arr[j + 1] = temp; } } }
		 */
		// 第一次迴圈n-1遍
		for (int i = arr.length - 1; i > 0; i--) {
			for (int j = 0; j < i; j++) {
                            //每次是a[j]和a[j+1]比較,前者小於後者就交換,那麼最小的一路交換到最後面,
下次就不考慮最後面的那個數,比較前面幾個就可以了,以此類推
				if (arr[j] < arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
//降序排列,升序的話只需要將if (arr[j] < arr[j + 1])改為if (arr[j] >arr[j + 1])

快速排序:

快速排序基於分治的思想,每次在數列中選取一個基準值,可以選第一個元素

然後定義兩個指標,I,J,

當I<J的時候,J從右向左掃描,找比基準值小的值,I從左向右掃描,找比基準值大的值,找到後交換兩者的順序,

這樣進行,總有I=J的時候,(條件就是先讓J從右向左掃描,再讓I從左到右,才能滿足I不大於J的條件),這時候讓基準值和I位置的變數交換,基準值左邊大數全小於它,基準值右邊的數全大於它,完成第一次任務

再來吧,既然基準值左邊的數都小於它,但還是亂序的,怎麼辦,對左邊的子序列排序,對右邊的子序列排序,遞迴進行,就會排好

 

程式碼如下,遞迴方式下的快速排序

public class QuickSort {
	public static void main(String[] args) {
		int[] arr = { 4, 1, 7, 6, 3, 5, 4, 4 };
		quickSort(arr);
		for (int i : arr) {
			System.out.print(i + ",");
		}
	}

	public static void quickSort(int[] arr) {
		partition(arr, 0, arr.length - 1);
	}

	public static void partition(int[] arr, int left, int right) {
		if (left > right) {
			return;
		}
		int i = left;
		int j = right;
		// 定義基準值為陣列第一個數
		int temp = arr[left];

		while (i < j) {
			// 從右往左找比基準值小的數
			while (arr[j] >= temp && i < j) {
				j--;
			}
			// 再從左向右找比基準數大的值,因為j先減小,那麼最終交換完成後退出while迴圈時,i只能等於j
			while (arr[i] <= temp && i < j) {
				i++;
			}
			// 如果i<j,交換它們位置的元素
			if (i < j) {
				int t = arr[i];
				arr[i] = arr[j];
				arr[j] = t;
			}
		}
		// 交換基準值和(i==j)處的元素,使基準值到一箇中間位置,
		// 左邊序列都小於基準值,亂序,右邊序列都大於基準值,亂序
		arr[left] = arr[i];
		arr[i] = temp;
		// 對左邊子序列進行快排
		partition(arr, left, i - 1);
		// 對右邊子序列進行快排
		partition(arr, i + 1, right);
	}

}