基本思想
第一種實現方法
public void sort(int[] array) {
int tmp;
int n = array.length;
for (int i = 0; i < n; i++) { // 進行n - 1次循環
for (int j = 1; j < n - i; j++) {
if (array[j - 1] > array[j]) {
tmp = array[j - 1];
array[j - 1] = array[j];
array[j] = tmp;
}
}
}
}
第二種實現方法
對第一種方法進行優化,設置一個標識,如果這一次發生了交換,則為true,否則為false。明顯如果下一次沒有發生變化,說明排序已經完成。
public void sort(int[] array) {
int tmp;
int n = array.length;
boolean flag = true;
while (flag) {
flag = false;
for (int j = 1; j < n; j++) {
if (array[j - 1] > array[j]) {
tmp = array[j - 1];
array[j - 1] = array[j];
array[j] = tmp;
flag = true; // 關鍵點
}
}
}
}
第三種實現方法
再進一步優化。如果有100個數,只有前面10個無序,那麼在第一次遍歷後,最後發生交換的位置肯定小於10,且這個位置後的數據肯定是有序的,記錄下這個位置,第二次只要從數組頭遍歷到這個位置就可以了。
public void sort(int[] array) {
int tmp;
int flag = array.length;
while (flag > 0) {
int k = flag;
flag = 0;
for (int j = 1; j < k; j++) {
if (array[j - 1] > array[j]) {
tmp = array[j - 1];
array[j - 1] = array[j];
array[j] = tmp;
flag = j; // 關鍵點
}
}
}
}