選擇法排序

選擇法排序,選擇法排序應該算是所有排序中最好理解的一種排序算法了。其思想是,先定位到第一個,然後再拿所有的數據跟它比較,如果比它小,就讓他們作交換,然後再定位到第二個,再拿出它後面所有的數據與它相比較,如果比它小就作交換,就這樣,不停的定位到第2個,第三個,一直到第n個,當定位到第n個的時候,真個就是一個順序的數列了。如下代碼:

public static void sort(int[] n){
		for(int i=0;i<n.length;i++){
			for(int j=i;j<n.length;j++){
				if(n[j]<n[i]){
					swap(n, i, j);
				}
			}
		}
	}
	
	/**交換函數*/
	public static void swap(int[] n,int i,int j){
		n[i]=n[i]^n[j];
		n[j]=n[i]^n[j];
		n[i]=n[i]^n[j];
	}

對於選擇法排序是可以進行優化的,比如定位到第i個數據,那麼第i個以後的都會跟他比較一次,如果滿足條件就會交換,例如第i+2個比第i個小,那麼他們會交換一次,然後比到後面,發現第i+5個又比第i個小,然後他們又交換一次,問題又來了需要這麼頻繁的交換麼?如果我們在比較的過程中作一個標記,也就是定義一個變量,例如 int mark;先讓mark=i,這個時候後面的數據就不要直接跟第i個比較了,直接跟第mark個比較,當比較到第i+2的時候,發現它比第i個小,這時候我們就暫時不讓他們作交換,而是把i+2
這個索引保存起來,也就是讓 mark=i+2;這個時候後面的再比較就是跟第i+2個比較了,然後後面比到i+5,就讓mark=i+5;等所有的都比較完了之後,會的到一個最終的mark值,這個時候就可以讓第i個跟第mark作交換,這樣一來,每一趟循環相當於只交換了一次數據,比之前的效率要提高不少。代碼如下:

public static void sort(int[] n){
		for(int i=0;i<n.length;i++){
			int index=i;
			for(int j=i+1;j<n.length;j++){				
				if(n[j]<n[index]){
					index=j;
				}
			}
			int t=0;
			t=n[i];
			n[i]=n[index];
			n[index]=t;
		}
	}



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