排序演算法01: 選擇排序
阿新 • • 發佈:2019-01-08
選擇排序是這樣的,
- 首先,找到陣列中最小的那個元素,將它與第一個元素交換。
- 其次,在剩下的元素中找到最小的元素,將它與陣列的第二個元素交換位置。如此往復,直到將整個陣列排序
選擇排序有如下兩個特點:
- 執行時間和輸入無關,掃描一遍陣列並不能為下一遍掃描提供什麼資訊。
- 資料移動是最少的,選擇排序用了N次交換,和陣列大小是線性關係。
對於長度為N的陣列,選擇排序需要列印N^2/2次比較與N次交換。
選擇排序的執行時間是平方級別的,平均比氣泡排序效率稍高。
Selection.java
public class Selection extends BaseSort { public static void sort(Comparable[] aa){ int min; for(int i=0; i<aa.length-1; i++){ min = i; for(int j=i; j<aa.length; j++){ if(less(aa[j], aa[min])){ min = j; } } exch(aa,i,min); } } public static void main(String[] args) { Comparable[] aa = getDoubleArray(5); sort(aa); show(aa); } }
父類BaseSort
public class BaseSort { static boolean less(Comparable v, Comparable w) { return v.compareTo(w)<0 ; } static void exch(Comparable[] aa, int i, int j) { Comparable c = aa[i]; aa[i] = aa[j]; aa[j] = c; } static void show(Comparable[] aa) { Stream.of(aa).forEach(item -> System.out.print(item+" ")); } public static boolean isSorted(Comparable[] aa) { for(int i=1; i<aa.length; i++) { if(less(aa[i],aa[i-1])) return false; } return true; } public static Comparable[] getDoubleArray(int N){ Double[] aa = new Double[N]; Random r = new Random(); for(int i=0; i<N; i++){ aa[i] = r.nextDouble(); } return aa; } }