排序算法解決問題的算法:輸入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。
(如有不同意見或建議,請留言,求證後,會立即更正內容,謝謝!)