选择排序

 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 }

 

posted on 2017-11-20 13:14  Itsad  阅读(165)  评论(0编辑  收藏  举报

导航