冒泡排序与选择排序的不同、快速排序与选择排序的结合

冒泡排序与选择排序的不同、快速排序与选择排序的结合

冒泡排序可以说是最简单的排序了。我们学习C语言循环的时候都会提到。
可见这是一种浅而易懂的排序算法!

但不见得这种算法就没用处。首先,他很容易理解,这样在各种教材中比较适合拿来“开门见山”。其次是他很稳定。 若明确知道即将排的数字很混乱,随机性很强,则用冒泡排序也未偿不可。 谁让他始终是O(n^2)呢。
冒泡排序法代码:
 1 void  BubbleSort( int  a[], int  l)
 2 {
 3    for(int i = 0; i< l;++i)
 4    {
 5        for(int j = i+1; j< l; ++j)
 6        {
 7            if(a[j]<a[i])
 8            {
 9                int t = a[i];
10                a[i] = a[j];
11                a[j] = t;
12            }

13        }

14    }

15}

从中我们可以看到,每次都会将后面的L-(i+1)个数拿来和a[i]比较,然后将小一点的换到前面。有人就觉得啊,这个每次都交换很费性能,影响效率。所以他们就将a[j]和a[i]比较后的最小值的下标记下来,当比较完之后,最后记下的下标就是最小的值的下标,然后再进行一次交换。于是便有了选择排序法。

选择排序法代码:
 1 void  SelectSort( int  a[], int  l)
 2 {
 3    for(int i = 0; i< l; ++i)
 4    {
 5        int k=i;
 6        for(int j = i+1; j<l;++j)
 7        {
 8            
 9            if(a[j]<a[k])
10            {
11                k=j;
12            }

13        }

14        int t = a[i];
15        a[i]=a[k];
16        a[k]= t;
17    }

18}

虽然,我们并没有根本性地扭转冒泡排序的地位。但效率是有明显提升的,至少减少了L*(L-1)-L = L*(L-2) = L^2 - 2*L次交换!

另外,目前广为使用的快速排序和选择排序联合使用,也会有意想不到的提升!
众所周知,当用快速排序法排序时,划分到很细的时候,明显很亏。 比如:两三个数排序却要划分成两堆,这样很划不来。所以,我们可以设定一个阀值,当快速排序划分到一定粒度的时候,便采用选择排序。 至于这个阀值,可以通过performace来测试,以得到一个“最优值”
 1 void  QSort( int  a[], int  l, int  r)
 2 {
 3    int p;
 4    if(l<r)
 5    {
 6        if(l-r<= DEFINE_NUMBER)
 7            SelectSort(a,l,r);
 8        else
 9        {
10            p = Partition(a,l,r);
11            QSort(a,l,p-1);
12            QSort(a,p+1,r);
13        }

14    }

15}
posted @ 2010-05-04 23:59 麒麟子(Alex) 阅读( ...) 评论( ...) 编辑 收藏
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值