一步一步實現選擇排序 ( java)

啥都不說,先上圖

思路:第一個元素與其後面的元素進行比較,大於就交換

以int[] arr = {2, 3, 6, -1, 2, 9}爲例

第一趟就是用arr[0]與arr[1]、arr[2]...arr[5]做比較,大於就交換,代碼可以寫成這樣

for (int j = 1; j < arr.length -1; j++) {
    if (arr[0] > arr[j]){
        int temp = arr[0];
        arr[0] = arr[j];
        arr[j] = temp;
    }
}
//[-1, 3, 6, 2, 2, 9]

這樣就得到了最小值-1       

接着第二趟,用arr[1]與其他做比較

min = arr[1];
for (int j = 2; j < arr.length -1; j++) {
    if (arr[1] > arr[j]){
        int temp = arr[1];
        arr[1] = arr[j];
        arr[j] = temp;
    }
}
//[-1, 2, 6, 3, 2, 9]

第三趟

for (int j = 3; j < arr.length -1; j++) {
    if (arr[2] > arr[j]){
        int temp = arr[2];
        arr[2] = arr[j];
        arr[j] = temp;
    }
}
//[-1, 2, 2, 6, 3, 9]

這裏就發現一點性能問題了,6與3比較,然後交換,然後3與2比較然後交換,這樣交換了兩次,如果數據大的話會進行很多次交換,不理想

然後可以修改成,(比如第二趟結束後 [-1, 2, 6, 3, 2, 9]),再定義一個變量用來存儲最小值的索引 int index = 0,到循環完之後才進行交換,這樣就只用進行一次交換

int[] arr = {2, 3,6, -1,2,9};

//當前最小值索引
int index = 0;
for (int j = 1; j < arr.length -1; j++) {
    if (arr[index] > arr[j]){
        index = j;//將當前這個數的索引存儲起來
    }
}
//如果發現,不需要交換的話,就跳過
if (index != 0){
    int temp = arr[index];
    arr[index] = arr[0];
    arr[0] = temp;
}
System.out.println(Arrays.toString(arr));//[-1, 3, 6, 2, 2, 9]

//當前最小值索引
index = 1;
for (int j = 2; j < arr.length -1; j++) {
    if (arr[index] > arr[j]){
        index = j;//將當前這個數的索引存儲起來
    }
}
if (index != 1){
    int temp = arr[index];
    arr[index] = arr[1];
    arr[1] = temp;
}

System.out.println(Arrays.toString(arr));//[-1, 2, 6, 3, 2, 9]

好寫到這,規律就出來了

public static void search(int[] arr){
    for (int i = 0; i < arr.length - 1; i++) {

        //當前最小值索引
        int index = i;
        for (int j = i + 1; j < arr.length -1; j++) {
            if (arr[index] > arr[j]){
                index = j;//將當前這個數的索引存儲起來
            }
        }
        if (index != i){
            int temp = arr[index];
            arr[index] = arr[i];
            arr[i] = temp;
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章