選擇排序
選擇排序,可以說是所有排序中最爲簡單的一種方式,選擇排序的原理就是,把所有數中最小的數挑出來放在第一個位置,然後不再考慮第一個數,剩下的數中再將最小的挑出來放在第一個位置,以此類推,這樣我們便可以將一列數進行排序了,這種算法非常的簡單,我們今天想說的不僅僅是算法的實現,也是整個排序和代碼的藝術性的實現,下面讓我們看一下我們的代碼:
package paixu;
import java.nio.file.Watchable;
public class Example {
public static void sort(Comparable[] a) {
int N = a.length;
for (int i = 0; i < N; i++) {
int min = i;
for (int j = i + 1; j < N; j++) {
if (less(a[j], a[min]))
min = j;
exch(a, i, min);
}
}
}
public static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.println(a[i] + " ");
System.out.println();
}
}
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++)
if (less(a[i], a[i - 1]))
return false;
return true;
}
public static void main(String[] args) {
String[] a = "B,D,C,A,E,G,F, ".split(",");
sort(a);
assert isSorted(a);
show(a);
}
}
當然根據我們的代碼,可想而知我們的輸出的結果是按照順序排好的A,B,C,D,E,F,G,我們這裏並不是單純的把所有代碼都羅列到主函數裏面,這裏面用到的函數的類的思想非常的明顯,這樣寫的好處是,如果我們想實現其它排序的話只需要非常簡單的修改一點代碼即可。
我們的less函數,返回的值是一個boolean類型的數值,這裏面用到了一個comparable的函數,此方法如果這個字符串是等參數字符串那麼返回值0,如果這個字符串是按字典順序小於字符串參數那麼返回小於0的值,如果此字符串是按字典順序大於字符串參數那麼一個大於0的值。
我們的exch函數的目的是爲了判斷的,是用來將兩個數據的值進行交換的。
我們的show函數的目的是,將排序好的數組輸出在屏幕上面。
我們的isSorted是一個判斷,用來判斷我們的排序是否成功的,如果我們的排序成功了,那麼將返回一個true,如果排序失敗了,那麼我們將返回一個false。
我們的sort函數就是我們選擇排序的關鍵所在了,採用兩個for循環來實現,外層的for循環是控制位置的,內層的for循環是用來決定這個數值是不是剩下數值中最小的,如果是最小的,就把它換到一個位置去。
我們的main函數中我們創建了一個string類型的數組,是將一個字符串通過split的方式變成的string類型的數組,然後調用我們的排序的方法,下面我們還涉及到一個重點就是斷言的方法,也就是說,如果我們斷言後面返回的是真的話,那麼我們就執行下面的操作,也就是輸出我們的結果,如果我們發現排序失敗了,那麼我們的斷言將會起作用,這個時候我們會拋出一個異常,也就不會有結果的輸出了。