排序算法(二)--选择排序(Select Sort)

算法定义

  选择排序的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。

时间复杂度

  选择排序比较时间复杂度为O(n^2),交换时间复杂度为O(n)

算法稳定性

  选择排序是一种不稳定的排序算法,主要取决于其排序原理。

选择排序与冒泡排序比较

  虽然选择排序与冒泡排序时间复杂度都是O(n^2),但是选择排序的交换次数较少,因此选择排序的整体性能略优于冒泡排序。(交换时间大于比较时间)

[admin@localhost selection_sort]$ ./select 100000 0
选择排序100000个数据,耗时9962205 usec.
[admin@localhost selection_sort]$ ./select 100000 0
选择排序100000个数据,耗时9996807 usec.

 

[admin@localhost algorithm]$ ./bubble 100000
排序100000个数据,耗时28781700 usec.
[admin@localhost algorithm]$ ./bubble 100000
排序100000个数据,耗时28952177 usec.

C代码实现

 1 #include <stdio.h>
 2 #include <time.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 #include <sys/time.h>
 6 
 7 #include "common.h"
 8 
 9 #define PRINT_ARRAY 1
10 
11 void select_sort(int *iArray, int size)
12 {
13     int min;
14     for(int i = 0; i < size; i++)
15     {
16         min = i;
17         for(int j = i; j < size; j++)
18         {
19             if(iArray[j] < iArray[min])
20             {
21                 min = j;
22             }
23         }
24 
25         if (min != i)
26         {
27             swap(&iArray[i], &iArray[min]);
28         }
29     }
30 
31     return;
32 }
33 
34 int main(int argc, char *argv[])
35 {
36     int size = atoi(argv[1]);
37     int isPrint = atoi(argv[2]);
38     IntArray *pstIntArray = mallocIntArray(size);
39     unsigned long ulTimeUse = 0;    /* usec level */
40     struct timeval stTimeStart;
41 
42     memset(&stTimeStart, 0, sizeof(stTimeStart));
43     memset(pstIntArray, 0, sizeof(IntArray));
44 
45     generateArray(pstIntArray->iArray, size);
46 
47     if (PRINT_ARRAY == isPrint)
48     {
49         printf("选择排序前: \r\n");
50         printArray(pstIntArray->iArray, size);
51     }
52 
53     COMMON_StartRecordTime(&stTimeStart);
54     select_sort(pstIntArray->iArray, size);
55     ulTimeUse = COMMON_EndRecordTime(&stTimeStart);
56 
57     if (PRINT_ARRAY == isPrint)
58     {
59         printf("选择排序后: \r\n");
60         printArray(pstIntArray->iArray, size);
61     }
62 
63     printf("选择排序%d个数据,耗时%ld usec.\r\n", size, ulTimeUse);
64 
65     return 1;
66 }

 

posted @ 2020-06-03 21:07  逃之夭夭uu  阅读(279)  评论(0编辑  收藏  举报