1. 程式人生 > >演算法學習——選擇排序

演算法學習——選擇排序

選擇排序,顧名思義就是要把元素選擇出來進行排序,要選擇,肯定就要有比較,這個時候我們的兩層for迴圈就派上用場了。

假設我們要對一個數組a進行排序,我們要定義兩個臨時變數(替身),一個是為陣列中順序即將發生變化的元素做替身,一個是為了代替陣列的下標,首先第一層for,我們要選出陣列的第一個元素a[0],用一個臨時變數temp代替a[0](temp = a[0]),用臨時變數flag代替陣列的下標,方便在第二層for中同陣列中的其它元素作比較,假設我們要將陣列升序排序,那麼在第二層for中,如果出現比a[0]小的數,就使temp等於該數的值,同時記錄下標的位置,第二層迴圈結束後,如果temp的值發生改變(下標的位置發生改變),那麼我們就讓a[0]等於temp,對應改變後的下標的位置處的值等於a[0],這就完成了第一趟排序,之後的第二趟、第三趟只要從a[1]、a[2]開始(由第一層for迴圈控制),以此類推,這樣每次都會選出剩下的數中最小的數放在第i位上,所以叫做選擇排序,當第一層for迴圈進行到陣列的最後一個元素時,排序完成。

簡單流程為:

int[] a = {54,21,69,23,45};

第一趟排序後元素的順序為:[21],54,69,23,45

第二趟排序後元素的順序為:[21],[23],69,54,45

第三趟排序後元素的順序為:[21],[23],[45],54,69

第四趟排序後元素的順序為:[21],[23],[45],[54],69

第五趟排序後元素的順序為:[21],[23],[45],[54],[69]

因未執行到的迴圈中的數的大小是不可預知的,所以迴圈會一直執行到最後,選擇排序的時間複雜度為O(n²)不變。

程式碼及測試結果如下:

package pp.suanfa;

/**
 * 選擇排序
 * 
 * @author Administrator
 * 
 */

public class chooseSort{
    
    public static void cSort(int a[]){
        
        int temp = 0;
        int flag = 0;
        for(int i=0;i<a.length;i++)
        {
            temp = a[i];//取出a[i]的值
            flag = i;//取出i的值
            for(int j=i+1;j<a.length;j++)
            {
                if(temp>a[j])//將a[i]與a[i]後面的元素進行比較,若a[i]>a[j]則將a[j]的值取出
                {
                    temp = a[j];
                    flag = j;
                }
            }
            if(flag!=i)
            {
                a[flag] = a[i];//此時將a[i]與最終的a[j]值互換
                a[i] = temp;
            }
        }
    }
        public static void main(String[] args){
            int a[] = {35,21,46,15,53};
            cSort(a);
            for(int i=0;i<a.length;i++)
            {
                System.out.print(a[i]+" ");
            }
            System.out.println();
    }
}