算法學習——選擇排序

作爲一名快畢業了的大四應屆生,在找工作的時候體會到的最大的痛就是會算法的人永遠比你有優勢!!!

學學簡單的算法,對自己還是有好處的。

選擇排序,顧名思義就是要把元素選擇出來進行排序,要選擇,肯定就要有比較,這個時候我們的兩層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循環控制),以此類推,當第一層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];
            flag = i;
            for(int j=i+1;j<a.length;j++)
            {
                if(temp>a[j])
                {
                    temp = a[j];
                    flag = j;
                }
            }
            if(flag!=i)
            {
                a[flag] = a[i];
                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();
    }
}

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