Java中算法---選擇排序

原理每一趟從待排序的記錄中選出最小的元素,順序放在已排好序的序列最後,直到全部記錄排序完畢。也就是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作爲有序序列中第i個記錄。基於此思想的算法主要有簡單選擇排序、樹型選擇排序和堆排序。(這裏只介紹常用的簡單選擇排序)

簡單選擇排序的的基本思想:給定的集合數組arr,第一趟排序,假定0位置的值是最小值,在待排序數組arr[1] ~ arrn[n]中逐個比較,選出最小值數的下標,讓他與下標爲0的數據進行互換位置;第二趟排序,假定1位置的值是最小值,在待排序數組arr[2] ~ arr[n]中逐個比較,選出最小值的下標,讓他與位置1的數據進行互換位置。。。。知道全部排序完後完成。

舉例說明:一個集合數據爲arr = {8, 9, 6, 3, 5, 7}

第一趟排序,假定一開始的最小是0位元素,也就是8。設定一個int型值m用來記錄最小值的下標,此時m=0;用arr[m]依次比較arr[1] ~ arr[n]的數值,如果arr[m]大於arr[x]比較的值,則將m的值設置爲x;將arr[1] ~ arr[n]的數值全部比較完後,找到arr數組中最小值的下標元素m,將arr[m]的值與一開始假定的最小值arr[0]進行互換位置,就可以得到第一趟排序後的數據結果:[3, 9, 6, 8, 5, 7];

第二趟排序,假定一開始的最小是1位元素,也就是9。設定一個int型值m用來記錄最小值的下標,此時m=1;用arr[m]依次比較arr[2] ~ arr[n]的數值,如果arr[m]大於arr[x]比較的值,則將m的值設置爲x;將arr[2] ~ arr[n]的數值全部比較完後,找到arr數組中最小值的下標元素m,將arr[m]的值與一開始假定的最小值arr[1]進行互換位置,就可以得到第一趟排序後的數據結果:[3, 5, 6, 8, 9, 7];

第三趟排序,假定一開始的最小是2位元素,也就是6。設定一個int型值m用來記錄最小值的下標,此時m=2;用arr[m]依次比較arr[3] ~ arr[n]的數值,如果arr[m]大於arr[x]比較的值,則將m的值設置爲x;將arr[3] ~ arr[n]的數值全部比較完後,找到arr數組中最小值的下標元素m,將arr[m]的值與一開始假定的最小值arr[2]進行互換位置,就可以得到第一趟排序後的數據結果:[3, 5, 6, 8, 9, 7];

第四趟排序,假定一開始的最小是3位元素,也就是8。設定一個int型值m用來記錄最小值的下標,此時m=3;用arr[m]依次比較arr[34 ~ arr[n]的數值,如果arr[m]大於arr[x]比較的值,則將m的值設置爲x;將arr[4] ~ arr[n]的數值全部比較完後,找到arr數組中最小值的下標元素m,將arr[m]的值與一開始假定的最小值arr[3]進行互換位置,就可以得到第一趟排序後的數據結果:[3, 5, 6, 7, 9, 8];

第五趟排序,假定一開始的最小是4位元素,也就是9。設定一個int型值m用來記錄最小值的下標,此時m=4;用arr[m]依次比較arr[5] ~ arr[n]的數值,如果arr[m]大於arr[x]比較的值,則將m的值設置爲x;將arr[5] ~ arr[n]的數值全部比較完後,找到arr數組中最小值的下標元素m,將arr[m]的值與一開始假定的最小值arr[4]進行互換位置,就可以得到第一趟排序後的數據結果:[3, 5, 6, 7, 8, 9];

代碼實現:

/** 選擇排序 */
List<Integer> integerList = new ArrayList<>();
List<Integer> newsList = new ArrayList<>();
Integer[] integers = {8, 9, 6, 3, 5, 7};
Collections.addAll(integerList, integers);
System.out.println("排序前:" + integerList);

for(int i=0; i<integerList.size()-1; i++) {
    int m = i;
    for(int j=i+1; j<integerList.size(); j++) {
        // 找出最小的值的下標
        if(integerList.get(m) > integerList.get(j)) {
            m = j;
        }
    }
    //找到最小數值後,互換位置
    if(i != m) {
        int temp = integerList.get(i);
        integerList.set(i, integerList.get(m));
        integerList.set(m, temp);
    }
    System.out.println("第" + (i+1) + "趟排序後:" + integerList);
}
System.out.println("最總排序結果爲:" + integerList);

 

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