經典排序算法--簡單選擇排序
阿新 • • 發佈:2017-05-18
減少 pac 高效 str creat election pub 臨時 ack
算法簡介
簡單選擇排序是一種選擇排序。
選擇排序:每趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排序的記錄序列末尾,直到全部排序結束為止。
白話理解
依然已排隊為例,在排隊時,有的老師可能會選擇這樣排序,先在一列中選出最矮的,放在第一位,然後選出第二矮的,放在第二位。隊伍完成排序。而這就是選擇排序的思想。
簡單排序處理流程
(1)從待排序序列中,找到關鍵字最小的元素;
(2)如果最小元素不是待排序序列的第一個元素,將其和第一個元素互換;
(3)從余下的 N - 1 個元素中,找出關鍵字最小的元素,重復(1)、(2)步,直到排序結束。
Java代碼實現:
1 package sortDemo;2 3 /** 4 * 插入代碼實現 5 * @author xianyu 6 * @CreatTime 下午8:16:11 7 */ 8 public class SelectionDemo { 9 10 public static void main(String[] args) { 11 int[] sort ={3,2,1,4,6,5,8,9,10,7} ; 12 System.out.println("排序前:"); 13 print(sort); 14 selectionDemo(sort);15 System.out.println("\n排序後:"); 16 print(sort); 17 } 18 19 public static void selectionDemo(int[] a){ 20 for (int i = 0; i < a.length; i++) { 21 for (int j = i+1; j < a.length; j++) { 22 if(a[j]<a[i]){ 23 inttmp = a[j]; 24 a[j] = a[i]; 25 a[i]=tmp; 26 } 27 } 28 } 29 } 30 31 public static void print(int[] a){ 32 for (int i = 0; i < a.length; i++) { 33 System.out.print(a[i]+" "); 34 } 35 } 36 }
算法分析:
時間復雜度
簡單選擇排序的比較次數與序列的初始排序無關。 假設待排序的序列有 N 個元素,則比較次數總是N (N - 1) / 2。
而移動次數與序列的初始排序有關。當序列正序時,移動次數最少,為 0.
當序列反序時,移動次數最多,為3N (N - 1) / 2。
所以,綜合以上,簡單排序的時間復雜度為 O(N2)。
空間復雜度
簡單選擇排序需要占用 1 個臨時空間,在交換數值時使用。
由交換條件,a[j+1]<a[i]可以判斷出,相同的值並不會交換。所以簡單選擇排序是穩定排序。
簡單選擇排序的改進——二元選擇排序
簡單選擇排序,每趟循環只能確定一個元素排序後的定位。我們可以考慮改進為每趟循環確定兩個元素(當前趟最大和最小記錄)的位置,從而減少排序所需的循環次數。改進後對n個數據進行排序,最多只需進行[n/2]趟循環即可。具體實現如下:
1 static void selectSort(int[] r) { 2 int n = r.length; 3 int i ,j , min ,max, tmp; 4 for (i=0 ;i <= n/2;i++) { 5 // 做不超過n/2趟選擇排序 6 min = i; max = i ; //分別記錄最大和最小關鍵字記錄位置 7 for (j= i+1; j<= n-1-i; j++) { 8 if (r[j] > r[max]) { 9 max = j ; continue ; 10 } 11 if (r[j]< r[min]) { 12 min = j ; 13 } 14 } 15 //該交換操作還可分情況討論以提高效率 16 tmp = r[i]; r[i] = r[min]; r[min] = tmp; 17 tmp = r[n-1-i]; r[n-1-i] = r[max]; r[max] = tmp; 18 } 19 }
經典排序算法--簡單選擇排序