CLRS 2.2分析算法

2.2-1
Θ(n3)

2.2-2
伪代码如下:

SELECTION-SORT(A):
  for i = 1 to A.length - 1
      min = i
      for j = i + 1 to A.length
          if A[j] < A[min]
              min = j
      temp = A[i]
      A[i] = A[min]
      A[min] = temp

运行代码如下:

void selection_sort(int *array,int length)
{
    for(int i = 0; i < length - 1; ++i)
    {
        int min = i;    //记录最小值的下标
        for(int j = i + 1; j < length; ++j)
            if(*(array + min) > *(array + j))
                min = j;
        int temp = *(array + min);
        *(array + min) = *(array + i);
        *(array + i) = temp;
    }
}

循环不变式:在第一个 for 循环开始迭代前,子数组A[1…i-1]包含了数组前 i-1 个最小数,且此子数组已经按非递减顺序排好,在第一个 for 循环开始迭代中,min 指示A[i..j−1]中最小数的下标。
之所以只需对前 n-1 个元素,是因为每次外面的 for 循环都会找出一个未排序的子数组中最小的的元素,执行 n-1 次后,前 n-1 个元素是数组前 n-1 个最小数,且已经排序,最后只剩最大的元素放在最末尾的位置,这样数组就排序完成。若进行 n 次,则最后一次是多余的。
最好和最坏的情况都需要 Θ(n2)

2.2-3
平均是检查一半,最坏情况下所有元素都要检查,所以都是 Θ(n)

2.2-4
我们检查是否已经排序,假如已经排序好了就直接返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值