1. 程式人生 > >簡單選擇排序(Java實現)

簡單選擇排序(Java實現)

基本概念:

在要排序的一組數中,選出最小的一個數與第1個位置的數交換;然後在剩下的數當中再找最小的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最後一個數)比較為止。

簡單選擇排序的特點為:交換移動資料次數少,比較次數多。

下面給出具體的程式碼:

package javastudy;

public class XuanZeSort {

	public void selectionSort(int A[], int n) {
		 //簡單選擇排序演算法,排序結果為遞增陣列
		 int min;//陣列下標min永遠指向每次集合比較中最小元素
		//外層迴圈:n-1次
		//需要注意到的是:陣列的最大下標比陣列的長度小1且陣列的下標從0開始
	    for(int i=0;i<n-1;i++)
	    {
	    	min = i;//給min賦初值,為陣列的0號元素的下標
	    	/**
	    	 * 第二層迴圈:迴圈n-1次
	    	 * j=i+1:初次比較的時候,i是靠前的那個元素 j是兩個數字中靠後的那個元素
	    	 */
	    	for(int j=i+1;j<n;j++)
	    	{   /**
	    	            當前面的數字大於後面的數字的時候 ,把後門數字的下標
	    	            賦值給min,保證下標min永遠指向兩個數字中最小的那一個
	    	           最終一輪比較下來,min指向的是集合元素比較當中最小的那一個元素
	    	    **/
	    		if(A[min]>A[j])
	    		{
	    			min = j;
	    		}
	    	}
	    	/**
	    	 * 如果min和i相等 也就是每一次的集合最前面的那個數字就是最小的
	    	 * 那麼我們就不需要再進行交換 這樣效率和穩定性更加高
	    	 */
	    	if(i!=min)
	    	{      
	    		swap(A,i,min);
	    	}
	    }
	}
    /**
     * 
     * 交換函式
     * 
     * 
     */
	public void swap(int A[], int i, int j) {
		int temp = A[i];
		A[i] = A[j];
		A[j] = temp;
	}
}

主函式來呼叫一下:

package javastudy;


public class MainTest {


	public static void main(String[] args) {
		XuanZeSort sort = new XuanZeSort();
		int A[] = {10,5,1,2,4,3,9,6};
		sort.selectionSort(A, A.length);
        for(int i=0;i<A.length;i++)
        {
        	System.out.print(A[i]+" ");
        }
	}


}

控制檯輸出結果為:

1 2 3 4 5 6 9 10  

達到了預期的目的

我們現在來分析一下最優情況下的複雜度和最差情況下的複雜度:

1.最優情況下:

排序的數字就是按照升序順序排序的,我們發現外層迴圈和內層迴圈各要執行n-1次

所以複雜度為:o(n^2)

2.最差情況下:

排序的數字是降序順序開始排序的,我們發現外層迴圈和內層迴圈還是各要執行n-1次

所以複雜度為:o(n^2);

3.平均時間複雜度為:o(n^2)

綜上所述,無論什麼情況下,簡單選擇排序的時間複雜度為o(n^2);