排序算法(1)——选择排序

[转载] 百度百科

1、拟解决问题

输入

n个数的序列<a1,a2,a3,...,an>。

输出

原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*

2、选择排序的思想

1)、假定第一个元素是最小值,依次 和其它每个元素比较,最终找到最小数,用变量k记住它在数组中的位置(下标);
2)、然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就放置好整个数组中最小的数了。
3)、假定第二个元素是最小值,然后找到数组中第二小的数,判断交换,就放置好整个数组中数组中第二小的数了。以此类推。

3、选择排序的实现

/* 选择排序 */
void select_sort(int*a,int n)
{
    int i,j,min,t;
    for(i=0;i<n-1;i++)
    {
        min=i;//查找最小值
        for(j=i+1;j<n;j++)
            if(a[min]>a[j])
                min=j;
        if(min!=i)//判断当前元素是否是就最小值
        {
            t=a[min];
            a[min]=a[i];
            a[i]=t;
        }
    }
}

4、选择排序的性能

1、时间复杂度

交换操作次数介于 0 ~ (n - 1) 。最好情况是,已经有序,交换0次;最坏情况交换n-1次;逆序要交换n/2次。

赋值操作次数是交换操作次数的3倍,介于 0 ~ 3 (n - 1) 之间。

比较操作次数次数与关键字的初始状态无关,都是N=(n-1)+(n-2)+…+1=n*(n-1)/2,即满足 O(n^2)。

2、稳定性

如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。
比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

和其它排序算法比较:
1)、选择排序比冒泡排序的交换次数少多了,由于交换所需的CPU时间 比 比较所需的CPU时间多,所以选择排序比冒泡排序快(n值较小时?还是无论n大小都是?)。
2)、堆排序类似于选择排序。它是利用了最大堆的性质——父亲要大于等于孩子的值,所以根节点是最大值,每次就选择根节点元素放到正确的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值