算法导论-----------选择排序 c++

到了大三才发现自己大二缺了多少的功课,最近开始看算法导论,将以前丢掉的拾起来。

在看完2.1插入排序之后,做了一下课后习题,看到这个算法---选择算法


选择算法的思想是:

第一次取得数组的最小元素,放在第一个位置。接着取得数组的第二小元素,放在第二个位置。。。。如此下去,直到找到倒数第二小的元素,放在倒数第二个位置,这样排序便完成了


书上的题目有一下几个问题:

1.该算法的循环不变式是什么?

2.为什么他只需要对前面的n-1个元素,而不是n个元素运行?

3.用θ表示最坏情况


首先用c++实现算法

void  ChoseSort(int len,int a[])

{

      int key = a[0];

      int pos = 0; 

      for(int i =0;i<len-1;i++)

      {

            key = a[i];

            pos = i;

           for(int j = i;j<len;j++)//寻找最小元素

          {

                  if(a[j]<key)

                {

                  key = a[j];

                  pos = j;

                }

          }

//交换结果

          a[pos] = a[i];

          a[i]  =  key;

      }

}



现在来看上面的问题

1.循环不变式问题,就是要证明这样做的科学性。需要证明三条性质

初始化,保持,终止

初始化:将最小的放在首位置

保持:每次找到比剩余里面最小的,放到相应位置

终止:len-1


2.很简单,第i-1小知道了,剩下一个肯定是倒数第一小


3.看看这个算法

不管数据如何分布,这个算法总需要比较

n-1 + n-2 +。。。。。+1 = (n-1)*n/2次

所以算法的最坏复杂度为θ(n*n)



这个算法很简单,但是在手写的时候还是出现了一些问题,还需多加练习。。









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值