1. 程式人生 > >經典排序算法--簡單選擇排序

經典排序算法--簡單選擇排序

減少 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 int
tmp = 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     }  

經典排序算法--簡單選擇排序