算法描述:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点是:如果某个元素位于正确的最终位置上,则它不会被移动。
度量:
数据结构 数组
最差时间复杂度 О(n²)
最优时间复杂度 О(n²)
平均时间复杂度 О(n²)
最差空间复杂度 О(n) total, O(1) auxiliary
最佳算法 偶尔出现
选择排序最多交换n-1次,交换次数比冒泡排序少多了,由于交换比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
源码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
void print_ary( int * ary, unsigned int len )
{
while( len-- > 0 ) {
printf("%d ", *ary++ );
}
putchar('\n');
}
void create_rondom_number(int **parray, unsigned int number)
{
struct timeval tpstart;
unsigned int i =0;
if (NULL != *parray)
{
return;
}
*parray = (int *)malloc(sizeof(unsigned int) * number);
(void)memset(*parray, 0, sizeof(unsigned int) * number);
gettimeofday(&tpstart,NULL);
//srandom(time(NULL));
srandom(tpstart.tv_usec);
for (i=0; i<number; ++i)
{
//(*parray)[i] = random()%number; // range is [0, number-1]
//(*parray)[i] = random()%(b-a) + a; //range is [a, b)
((*parray)[i] = 1 + (int) ((double)number * rand() / (RAND_MAX + 1.0))); // [1, number]
}
}
void select_sort(int *a, unsigned int n)
{
unsigned int i, j, min, tmp;
for(i = 0; i < n - 1; i ++) {
min = i;
//查找最小值
for(j = i + 1; j < n; j ++) {
if(a[min] > a[j]) {
min = j;
}
}
printf("\nmin=%d i=%d ", min, i);
//交换
if(min != i) {
tmp = a[min];
a[min] = a[i];
a[i] = tmp;
printf("swap: ", min);
}
print_ary( a, n );
}
}
int main( int argc, char **argv )
{
int *pary = NULL;
if (argc !=2)
{
printf("\nUsage: %s Number\n", argv[0]);
return -1;
}
create_rondom_number(&pary, (unsigned int)atoi(argv[1]));
printf("\n\nrandom number: ");
print_ary( pary, (unsigned int)atoi(argv[1]) );
printf("Start sortting: \n");
select_sort( pary, (unsigned int)atoi(argv[1]));
printf("\n\nafter sorted: ");
print_ary( pary, (unsigned int)atoi(argv[1]) );
return 0;
}
运行结果:
[root@localhost sort]# ./select 10
random number: 8 4 3 4 10 1 2 10 10 4
Start sortting:
min=5 i=0 swap: 1 4 3 4 10 8 2 10 10 4
min=6 i=1 swap: 1 2 3 4 10 8 4 10 10 4
min=2 i=2 1 2 3 4 10 8 4 10 10 4
min=3 i=3 1 2 3 4 10 8 4 10 10 4
min=6 i=4 swap: 1 2 3 4 4 8 10 10 10 4
min=9 i=5 swap: 1 2 3 4 4 4 10 10 10 8
min=9 i=6 swap: 1 2 3 4 4 4 8 10 10 10
min=7 i=7 1 2 3 4 4 4 8 10 10 10
min=8 i=8 1 2 3 4 4 4 8 10 10 10
after sorted: 1 2 3 4 4 4 8 10 10 10
[root@localhost sort]#
参考:
http://zh.wikipedia.org/wiki/%E9%81%B8%E6%93%87%E6%8E%92%E5%BA%8F
http://baike.baidu.com/view/547263.htm