1 /**初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列; 2 3 然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。 4 5 以此类推,直到所有元素均排序完毕。**/ 6 7 #include <stdio.h> 8 9 // 分类 -------------- 内部比较排序 10 // 数据结构 ---------- 数组 11 // 最差时间复杂度 ---- O(n^2) 12 // 最优时间复杂度 ---- O(n^2) 13 // 平均时间复杂度 ---- O(n^2) 14 // 所需辅助空间 ------ O(1) 15 // 稳定性 ------------ 不稳定 16 17 void Swap( int A[], int i, int j) 18 { 19 int temp = A[i]; 20 A[i] = A[j]; 21 A[j] = temp; 22 } 23 24 void SelectionSort( int A[], int n ) 25 { 26 int i, j, min; 27 for( i = 0; i < n-1; i++ ) // i为已排序序列的末尾 28 { 29 min = i; 30 for( j = i+1; j < n; j++) // 未排序序列 31 { 32 if( A[min] > A[j]) // 找出未排序序列中的最小值 33 min = j; 34 } 35 if( i != min ) 36 { 37 Swap( A, min , i); // 放到已排序序列的末尾,该操作很有可能把稳定性打乱,所以选择排序是不稳定的排序算法 38 } 39 } 40 } 41 42 int main() 43 { 44 int A[] = { 8, 5, 2, 6, 9, 3, 1, 4, 0, 7 }; // 从小到大选择排序 45 int n = sizeof(A) / sizeof(int); 46 47 SelectionSort(A, n); 48 49 int i; 50 printf("选择排序结果:"); 51 for( i = 0; i < n; i++ ) 52 { 53 printf("%d ", A[i]); 54 } 55 printf("\n"); 56 return 0; 57 }