排序系列(一)

1.冒泡法:
这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:
#include
<iostream.h>

void BubbleSort(int* pData,int Count)
{
   
int iTemp;
   
for(int i=1;i<Count;i++)
    {
       
for(int j=Count-1;j>=i;j--)
        {
           
if(pData[j]<pData[j-1])
            {
                iTemp
= pData[j-1];
                pData[j
-1] = pData[j];
                pData[j]
= iTemp;
            }
        }
    }
}

void main()
{
   
int data[] = {10,9,8,7,6,5,4};
    BubbleSort(data,
7);
   
for (int i=0;i<7;i++)
        cout
<<data[i]<<" ";
    cout
<<"/n";
}

倒序(最糟情况)
第一轮:
10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)
第二轮:
7,10,9,8->7,10,8,9->7,8,10,9(交换2次)
第一轮:
7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:6次

其他:
第一轮:
8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)
第二轮:
7,8,10,9->7,8,10,9->7,8,10,9(交换0次)
第一轮:
7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:3次

上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为1
+2+...+n-1。写成公式就是1/2*(n-1)*n。现在注意,我们给出O方法的定义:

    若存在一常量K和起点n0,使当n
>=n0时,有f(n)<=K*g(n),则f(n) = O(g(n))。(呵呵,不要说没学好数学呀,对于编程数学是非常重要的!!!)

现在我们来看1
/2*(n-1)*n,当K=1/2,n0=1,g(n)=n*n时,1/2*(n-1)*n<=1/2*n*n=K*g(n)。所以f(n)=O(g(n))=O(n*n)。所以我们程序循环的复杂度为O(n*n)。*n)。当数据为正序,将不会有交换。复杂度为O(0)。乱序时处于中间状态。正是由于这样的原因,我们通常都是通过循环次数来对比算法。

再看交换。从程序后面所跟的表可以看到,两种情况的循环相同,交换不同。其实交换本身同数据源的有序程度有极大的关系,当数据处于倒序的情况时,交换次数同循环一样(每次循环判断都会交换),复杂度为O(n

 

来自:http://topic.csdn.net/u/20080928/14/4e7a079c-21c4-484b-ab80-3785beccd489.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值