日常记录:《算法导论》学习笔记之二

  在《算法导论》中还提到了合并算法,该算法采用分治法(divide-and-conquer)的思想。再次以整理扑克牌为例说明,当一堆杂乱无序的牌堆分为有序的两堆,比较两堆牌最上面的一张,按从小到大的方式合并起来,最后得到的一定是有序的,但由一堆无序的牌分为两堆时,所得到的仍旧是杂乱无序的,我们可以依次下去,直到最小的牌堆中只有一张牌时,此时是绝对有序的,然后依次合并,最后得到整理好的牌,这种算法称为合并算法。

  在设计算法时,为了“监视”合并时纸牌不会“越界”,在每个牌堆末设置“哨兵(sentinel)”牌,其伪代码如下:

MERGE(A, p, q, r)
n1 = q - p + 1
n2 = r - q
L[n1+1], P[n2+1]
for i : 0 to n1-1
  L[i] = A[p+i-1]
for j : 0 to n2-1
  R[j] = A[q+j]
L[n1+1] = ∞
R[n2+1] = ∞
i = 0
j = 0
for k : p to r
  if L[i] <= R[j]
    A[k] = L[i]
    i++
  else
    A[k] = R[j]
    j++
  给定一组实例,用C++实现合并算法如下:

  在章节练习中,提到将sentinel card除去,当合并的两个牌堆中任意一个没有牌时,将另一个牌堆直接放到合并牌后,笔者使用自己的想法实现,代码如下,如果有更好的欢迎提出交流:

  除此之外,练习中还提到了一种排序算法,冒泡排序,其思路是依次比较相邻两个元素大小,符合筛选条件的交换位置,就好像吐泡泡一样,每次遍历从最末尾开始,结束时将最小或者最大的放到前面。给定一组实例,C++编程实现如下:

你可能感兴趣的:(算法,算法导论)