選擇排序法 是對 定位比較交換法(也就是冒泡排序法) 的一種改進。
選擇排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。
簡單選擇排序的基本思想:第1趟,在待排序記錄r[1]~r[n]中選出最小的記錄,將它與r[1]交換;第2趟,在待排序記錄r[2]~r[n]中選出最小的記錄,將它與r[2]交換;以此類推,第i趟在待排序記錄r[i]~r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢。
以下為簡單選擇排序的存儲狀態,其中大括號內為無序區,大括號外為有序序列:
初始序列:{49 27 65 97 76 12 38}
第1趟:12與49交換:12{27 65 97 76 49 38}
第2趟:27不動 :12 27{65 97 76 49 38}
第3趟:65與38交換:12 27 38{97 76 49 65}
第4趟:97與49交換:12 27 38 49{76 97 65}
第5趟:76與65交換:12 27 38 49 65{97 76}
第6趟:97與76交換:12 27 38 49 65 76 97 完成
第1趟:12與49交換:12{27 65 97 76 49 38}
第2趟:27不動 :12 27{65 97 76 49 38}
第3趟:65與38交換:12 27 38{97 76 49 65}
第4趟:97與49交換:12 27 38 49{76 97 65}
第5趟:76與65交換:12 27 38 49 65{97 76}
第6趟:97與76交換:12 27 38 49 65 76 97 完成
C code:
1 void SelectSort( int a[], int length ) 2 { 3 //對數組a排序,length是數組元素數量 4 for( int i = 0; i < length; i++ ) { 5 // 找到從i開始到最后一個元素中最小的元素,k存儲最小元素的下標. 6 int k = i; 7 for( int j = i + 1; j < length; j++ ) { 8 if( a[j] < a[k] ) { k = j; } 9 } 10 11 // 將最小的元素a[k] 和 開始的元素a[i] 交換數據. 12 if( k != i ) { 13 int temp; 14 temp= a[k]; 15 a[k] = a[i]; 16 a[i] = temp; 17 } 18 } 19 }
選擇排序演示程序:
1 #include "stdio.h" 2 #include "stdlib.h" 3 4 void printArray( int* a, int length ) 5 { 6 for( int i = 0; i < length; i++ ) 7 { 8 printf( "%d ", a[i] ); 9 } 10 printf( "\n" ); 11 } 12 13 void SelectSort( int a[], int length ) 14 { 15 //對數組a排序,length是數組元素數量 16 for( int i = 0; i < length; i++ ) { 17 // 找到從i開始到最后一個元素中最小的元素,k存儲最小元素的下標. 18 int k = i; 19 for( int j = i + 1; j < length; j++ ) { 20 if( a[j] < a[k] ) { k = j; } 21 } 22 23 // 將最小的元素a[k] 和 開始的元素a[i] 交換數據. 24 if( k != i ) { 25 int temp; 26 temp= a[k]; 27 a[k] = a[i]; 28 a[i] = temp; 29 } 30 } 31 } 32 33 void main() 34 { 35 int a[]={ 1,56,8,66,2,57,49,26,68,99,100 }; 36 int length=sizeof( a ) / sizeof( a[0] ); 37 printf( "排序前:" ); 38 printArray( a, length ); 39 SelectSort( a, length ); 40 printf( "排序后:" ); 41 printArray( a, length ); 42 system( "pause" ); 43 }
Output Result:
排序前:1 56 8 66 2 57 49 26 68 99 100 排序后:1 2 8 26 49 56 57 66 68 99 100 請按任意鍵繼續. . .