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 }