選擇排序是簡單排序的一種,其排序思想為:首先將第一個數標記為最大數,其位置為最大數的位置;然後排除第一個數,使用第一個數和剩下的數依次比較,若剩下的數大於第一個數,則繼續比較,直到找到最大數為止;最後判斷實際最大數的位置是否就是預設最大數的位置,若不是,則用第一個數的位置和最大數的位置進行交換,則此時第一個數就是實際最大數。以此類推,比較剩下的數,得到降序排列;反之為升序排列。
工具/原料
雙重迴圈
方法/步驟
/** 選擇降序排序 **/
public static int[] dascSort(int[] param) {
int in, out;
int max;
int temp;
for (out = 0; out < param.length; out++) {
// 預設最大數的位置
max = out;
for (in = out + 1; in < param.length; in++) {
if (param[max] < param[in]) {
// 獲取最大數的位置
max = in;
}
}
// 當預設位置的最大數並不是實際的最大數時,和實際的最大數交換位置
if (out != max) {
temp = param[out];
param[out] = param[max];
param[max] = temp;
}
}
return param;
}
/** 選擇升序排序 **/
public static int[] ascSort(int[] param) {
int in, out;
int max;
int temp;
for (out = param.length - 1; out > 0; out--) {
// 預設最大數的位置
max = out;
for (in = out - 1; in > 0; in--) {
if (param[max] < param[in]) {
max = in;
}
}
// 當預設位置的最大數並不是實際的最大數時,和實際的最大數交換位置
if (out != max) {
temp = param[out];
param[out] = param[max];
param[max] = temp;
}
}
return param;
}
執行升序和降序方法:
public static void main(String[] args) {
int[] param = { 1, 6, 7, 5 };
param = ascSort(param);
System.out.print("升序結果為:");
for (int i = 0; i < param.length; i++) {
System.out.print(param[i]);
}
System.out.println("");
param = dascSort(param);
System.out.print("降序結果為:");
for (int i = 0; i < param.length; i++) {
System.out.print(param[i]);
}
}
執行結果如下:
注意事項
選擇排序的效率為O(N*N),比較次數最多為N(N-1)/2,交換次數最多為N-1
選擇排序不穩定