天天看點

八大排序算法 之 冒泡排序VS選擇排序

排序思想:(二者相同)

每次循環将最大值拿出來放到最後(或将最小值放到開頭),n-1趟循環後,即可完成排序

排序趟數:

最大n-1趟

排序原理:

冒泡排序:

每次循環,從第一個數開始,相鄰數依次比較,較大的往後放

選擇排序:

每次循環,拿出第一個數作為最小值,跟後面所有數依次比較,每次記錄最小值得下标,最後将第一個數和最小值交換

代碼實作如下:

//冒泡排序
	public static void bubbleSort(int[] array){
		boolean isExchange = false;
		for (int i = 0; i < array.length - 1; i++) {//最大趟數length-1趟
			for (int j = 0; j < array.length - 1 - i; j++) {//每次最大數放到後面,則每次減少比較次數
				if (array[j]> array[j +1]) {//相鄰兩個數比較,将較大的放到後面
					array[j] ^= array[j + 1];
					array[j + 1] ^= array[j];
					array[j] ^= array[j + 1];
					isExchange = true;
				}
			}
			if (!isExchange) {//如果沒有交換,說明中途已經排序完成,可以終止循環,直接退出,優化算法
				break;
			}
		}
	}
           
//選擇排序
	public static void chooseSort(int[] array){
		for (int i = 0; i < array.length - 1; i++) {//循環length - 1趟
			int minIndex = i;//将本趟的第一個數暫時定義為最小值,則其下标為最小值下标
			for (int j = i; j < array.length; j++) {//每次隔過前面的數,從第i個數開始循環;
				if (array[minIndex] > array[j]) {
					minIndex = j;//拿最小數跟後面的所有數比較,發現有比它小的,記錄下标;
				}
			}
			if (minIndex != i) {//如果最小數不是本身,說明找到了另外的最小數,通過交換将這個最小數放到本趟循環的最前面;
				array[i] ^= array[minIndex];//通過異或運算交換兩個數的數值;
				array[minIndex] ^= array[i];
				array[i] ^= array[minIndex];
			}
		}
	}