排序算法之选择排序

算法描述:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序的主要优点是:如果某个元素位于正确的最终位置上,则它不会被移动。

度量:

数据结构     数组
最差时间复杂度     О(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值