3.選擇排序
前言
選擇排序的含義就是因爲每一次最內層for走一趟都會選擇出一個最大或最小的數。
實現思路
比如有N個數,開始先選取第一個數( i= 0 )作爲基準數。然後拋開這個數以以前的數,右邊的數( i+1 To n-1 )走一趟for,找出最小(最大也行,看你是要升序還是降序),然後拿到這個最小的數,和基準數交換。然後下一次又重新定位基準數 i + 1,繼續走右邊的數一趟,找到最值,繼續交換…….如此反覆。
模擬走位
初始數組: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11]
i = 0 :[ 2 , 17 , 16 , 16 , 7 , 31 , 39 , 32 , 38 , 11 ] ( 0th [38]<->8th [2] )
i = 1 :[ 2 , 7 , 16 , 16 , 17 , 31 , 39 , 32 , 38 , 11 ] ( 1st [17]<->4th [7] )
i = 2 :[ 2 , 7 , 11 , 16 , 17 , 31 , 39 , 32 , 38 , 16 ] ( 2nd [11]<->9th [16] )
i = 3 :[ 2 , 7 , 11 , 16 , 17 , 31 , 39 , 32 , 38 , 16 ] ( 無需交換 )
i = 4 :[ 2 , 7 , 11 , 16 , 16 , 31 , 39 , 32 , 38 , 17 ] ( 4th [17]<->9th [16] )
i = 5 :[ 2 , 7 , 11 , 16 , 16 , 17 , 39 , 32 , 38 , 31 ] ( 5th [31]<->9th [17] )
i = 6 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 6th [39]<->9th [31] )
i = 7 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 無需交換 )
i = 8 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 無需交換 )
i = 9 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 無需交換 )
總結:選擇排序隨着 i 的 增大,比較次數也相應的減少了,無論數組是否有序,都會從 數組的開始 到 數組結束進行一次比較。次數也是固定的 n + (n-1) + … + 2 + 1,而交換的次數也和初始化數組的排序有關。
所以:最壞的情況是,n次;最好的情況是,0次。
實現代碼
public <T extends Comparable<T>> T[] selectionSorting(T[] array, boolean ascend) {
// 取得數組長度
int len = array.length;
//逐個選擇比較
for (int i = 0; i < len; i++) {
int selected = i;
/**
* 與選擇後的 其他元素比較
* Comparable.compareTo() 方法
* -1 : 小於
* 0 : 等於
* 1 : 大於
*/
for (int j = i + 1; j < len; j++) {
int compare = array[j].compareTo(array[selected]);
/**
* 如果
* array[j] != array[selected]
* 並且
* array[j] 小於 array[selected]
* 都成立的時候
*/
if ((compare != 0 && compare < 0) == ascend) {
selected = j;
}
}
/**
* 基準數 和 被選擇的交換
* 當然要是沒找到選擇的數,那麼被選擇數一直沒變是i
* 也就是基準數自己和自己的交換
*/
T t = array[i];
array[i] = array[selected];
array[selected] = t;
System.out.print("i = " + i + " array = ");
for (T data : array) {
System.out.print(data + " ");
}
System.out.println("");
}
return array;
}
運行
public static void main(String[] args) {
/**
* 選擇排序
*/
SelectionSort selectionSorting = new SelectionSort();
Integer[] object = {38, 17, 16, 16, 7, 31, 39, 32, 2, 11};
System.out.println("\n選擇排序\n");
Integer[] result = selectionSorting.selectionSorting(object, true);
System.out.println("\n選擇排序\n");
for (int i : result) {
System.out.print(i + " ");
}
}