經典排序算法 - 選擇排序Selection_sort

思想

n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:
①初始狀態:無序區爲R[1..n],有序區爲空。
②第1趟排序
在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變爲記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
……
③第i趟排序
第i趟排序開始時,當前有序區和無序區分別爲R[1..i-1]和R(i..n)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R分別變爲記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

通俗的解釋

對比數組中前一個元素跟後一個元素的大小,如果後面的元素比前面的元素小則用一個變量k來記住他的位置,接着第二次比較,前面“後一個元素”現變成了“前一個元素”,繼續跟他的“後一個元素”進行比較如果後面的元素比他要小則用變量k記住它在數組中的位置(下標),等到循環結束的時候,我們應該找到了最小的那個數的下標了,然後進行判斷,如果這個元素的下標不是第一個元素的下標,就讓第一個元素跟他交換一下值,這樣就找到整個數組中最小的數了。然後找到數組中第二小的數,讓他跟數組中第二個元素交換一下值,以此類推。
  
//選擇排序法
class Selection_sort
{
	//選擇排序
	public void sort(int arr[])
	{
		int temp=0;
		//默認第一個最小
		for(int j=0;j<arr.length;j++)
		{

			int min=arr[j];
			//記錄最小數的下標
			int minIndex=j;
			for(int k=j+1; k<arr.length ;k++)
			{
				if(min>arr[k])
				{
					//修改最小
					min=arr[k];
					minIndex=k;
				}	
			}		//退出for循環就找出本次最小值	 
			
			//交換
			temp=arr[j];
			arr[j]=arr[minIndex];
			arr[minIndex]=temp;
		}
	}
}

發佈了19 篇原創文章 · 獲贊 27 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章