排序算法(二)--选择排序(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 }