三 ,選擇排序
從算法邏輯上看,選擇排序是一種簡單直觀的排序算法,在簡單選擇排序過程中,所需移動記錄的次數比較少。
1,基本思想
選擇排序的基本思想:比較+交換
在待排序的一組數據中,選出最小(最大)的一個數與第一個位置的數交換,然后在剩下的數中,再找最小(最大)的數與第二個位置的數交換位置,
依次類推,直到第N-1個元素與第N個元素交換位置,選擇排序結束。
2,過程描述
操作方法:
第一趟:從n個記錄中找出關鍵碼最小的記錄和第一個記錄交換;
第二趟:從第二個記錄開始的n-1個記錄中再選出關鍵碼最小的記錄與第二個記錄交換
以此類推......
第i趟,則從第i個記錄開始的n-i+1個記錄中選出關鍵碼最小的記錄與第i個記錄交換,直到整個序列按關鍵碼有序。
3,代碼案例:
public class SelectSort { public static void main(String[] args) { //定義一個數組 int arr[]={3,1,2,5,4}; SelectSort(arr); System.out.println("選擇排序:"+Arrays.toString(arr)); } public static void SelectSort(int[] array) { //判斷數組為空或為一個元素的情況 if (null == array || array.length <= 1) { return; } //數組比較次數n-1 for (int i = 0; i < array.length - 1; i++) { int min = i;//保存當前最小元素的位置 //遍歷待排序數組元素(i之后的元素) for (int j = i + 1; j < array.length; j++) { //如果已排序中 較大元素 大於 待排序元素中的 最小元素 則更換元素對應索引 if (array[min] > array[j]) { min = j; } //確保找出待排序的最小元素的編號 } //置換位置 int temp = array[min]; array[min] = array[i]; array[i] = temp; } } }
4,選擇排序的時間復雜度
簡單選擇排序的比較次數與序列的初始排序無關。假設待排序的系列有N個元素,則比較次數總是N(N-1)/2
而移動次數與系列的初始排序有關,當排序正序時,移動次數最少,為0
當序列反序時,移動次數最多,為3N(N-1)/2
所以,綜上,簡單排序的時間復雜度為O(N*N)
平均時間復雜度 | 最好情況 | 最壞情況 | 空間復雜度 |
---|---|---|---|
O(n²) | O(n²) | O(n²) | O(1) |
選擇排序的簡單和直觀名副其實,這也造就了它”出了名的慢性子”,無論是哪種情況,哪怕原數組已排序完成,它也將花費將近n²/2次遍歷來確認一遍。
即便是這樣,它的排序結果也還是不穩定的。 唯一值得高興的是,它並不耗費額外的內存空間。
法,在簡單選擇排序過程中,所需移動記錄的次數比較少。