Fork me on GitHub

数据结构与算法——十个排序算法之二 · 选择排序

选择排序:

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间,假如有几个妹子,用她们的身高给出一个数组,数据如下:

163 161 158 163 171 170 165 159 162

 

 

让我们用身高从低到高给她们排序,常见的思维如下:

1. 先找出所有妹子中身高最高的,与最后一个数交换

163 161 158 163 171 170 165 159 162

 

 

163 161 158 163 162 170 165 159 171

 

 

2. 再找出除最后一位外其它妹子中的最高者,与倒数第二个交换位置

163 161 158 163 162 170 165 159 171

 

 

163 161 158 163 162 159 165 170 171

 

 

3. 再找出除最后两位外其它妹子中的最高者,与倒数第三个交换位置,因为倒数第三个本身已是最大的,所以实际无需交换.

163 161 158 163 162 159 165 170 171

  

 

重复以上步骤,直到最后只剩下一人,此时所有人均已按照从低到高顺序排列

158 159 161 162 163 163 165 170 171

 

 

动图演示(来源 runoob.com):

  

 

代码实现: 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 void swap(int *num1,int *num2)            //交换两个变量的值
 5 {
 6     int temp = *num1;
 7     *num1 = *num2;
 8     *num2 = temp;
 9 }
10 
11 void SelectSort1(int arr[], int len)
12 {
13     for( int i=0; i<len-1; i++)
14     {
15         int max = 0;
16         for(int j=1; j<len-i; j++)
17         {    //查找未排序的元素
18             if(arr[j]>arr[max])
19             {//找到目前最小值
20                 max = j;
21             }
22         }
23 
24         //printf("max: %d beauties %d\n", max,len-i-1);
25         if(max != (len-i-1))
26         {
27             swap(&arr[max], &arr[len-i-1]);
28         }
29     }
30 }
31 
32 void SelectSort2(int arr[], int len)
33 {
34     int i,j;
35     for (i = 0 ; i < len - 1 ; i++)
36     {
37         int min = i;
38         for (j = i + 1; j < len; j++)
39         {
40             //查找未排序的元素
41             if (arr[j] < arr[min])
42             {    //找到目前最小值
43                 min = j;                //记录最小值
44             }
45         }
46 
47         swap(&arr[min], &arr[i]);        //交换
48     }
49 }
50 
51 int main(void)
52 {
53     int beauties[]={163, 161, 158, 165, 171, 170, 163, 159, 162};
54     int len = sizeof(beauties)/sizeof(beauties[0]);
55     /*for( int i=0; i<len-1; i++)
56     {
57         int max = 0;
58         for(int j=1; j<len-i; j++)
59         {
60             if(beauties[j]>beauties[max])
61             {
62                 max = j;
63             }
64         }
65         printf("max: %d beauties %d\n", max,len-i-1);
66         if(max != (len-i-1))
67         {
68             swap(&beauties[max], &beauties[len-i-1]);
69         }
70     }
71     */
72     SelectSort2(beauties, len);
73 
74     for(int i=0; i<len; i++)
75     {
76         printf("%d ", beauties[i]);
77     }
78 
79     system("pause");
80 }

 

 

 

 

 

 

 

====================================================================================================================

posted @ 2020-12-12 15:44  索智源  阅读(149)  评论(0编辑  收藏  举报