算法學習之選擇排序(直接選擇)

排序算法解決問題的算法:輸入n個對象,按對象的某一個特徵緯度排序並輸出。

選擇排序的基本思想:

      首先,在未排序的數列中,找到最小(或最大)元素;然後,將其放到新數列的起始位置;接着,再從剩餘未排序的元素中繼續尋找最小(或最大)元素,放到已排序的末尾;以此類推,直到所有元素均排序完畢,得到一個新的正序(或倒序)的數列。

      Java代碼demo:

public int[] selectSort(int[] arr1){
    int[] arr2 = new int[arr1.length];
    for(int i=0; i< arr2.length; i++){
       int minVal = arr1[0];
       int minIndex = 0;
       for(int j=1; j < arr1.length; j++){
          if(minVal > arr1[j]){
             minVal = arr1[j];
             minIndex = j;
          }
       }
        arr2[i] = minVal;
        arr1 = remove(minIndex, arr1);
    }
    return arr2;
 }
private int[] remove(int index, int[] arr){
    for(int i=index; i < arr.length - 1; i++){
        arr[i] = arr[i+1];    
    }
    int[] copy = new int[arr.length-1];
    System.arraycopy(arr,0,copy,0,arr.length -1)
    return copy
}

時間和空間的複雜度理解:

每一次找到數組中的最小值,都要循環遍歷數組中的每一個元素。若數組中有n個元素,運行時間複雜度O(n²),運行空間複雜度O(1)。

上面這段代碼排序是相對穩定,對比基本選擇排序。基本選擇排序思路:首先,比較查找數列中的最小值;然後把它與數列的起始位置互換;其次,查找剩餘未排序元素的最小值,並與第二個元素位置互換;...依次循環,會得到一個正序的數列。不穩定是指元素的相對位置不穩定。例如:{6,6,7,3,9}

第一次排序:{3 ,原數列第二個6,7,原數列第一個6,9}

第二次排序:{3,原數列第二個6,7,原數列第一個6,9}

第三次排序:{3,原數列第二個6,原數列第一個6,7,9}

...

排序之後,兩個元素6的相對位置前後顛倒,這是不穩定因素。

選擇排序的另一種寫法:

直接選擇排序,在原數組中進行排序:

Java代碼demo:

	public int[] selectSort(int[] arr){
		for (int i = 0; i <arr.length; i++){
			int index = i;
			int value = arr[i];
			for (int j = i + 1; j < arr.length; j++){
				if (value > arr[j]){
					value = arr[j];
					index = j;
				}
				//一輪循環下來找到最小的位置
			}
			arr[index] = arr[i];
			arr[i] = value;
		}
		return arr;
	}

核心思想:從數組中取出一個最大或最小值,放在隊首或隊尾;然後在從剩餘的數組元素中,再取最大最小值,放在隊首或隊尾;重複到剩餘元素爲0。

(如有不同意見或建議,請留言,求證後,會立即更正內容,謝謝!)

 

 

 

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