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

  算法作为计算编程中的重要组成部分,其意义显而易见,所以我选择算法和数据结构中的经典书籍《算法导论》作为主要参考书目来深入学习算法和数据结构的内容。

  

输入:n个数(a1,a2,a3...an)
输出:输入序列的一个排列(重新排序)a'1,a'2,a'3...a'n,使得a'1≥a'2≥a'3≥...≥a'n。

  引用《算法导论》书中的解释,插入排序算法可以比喻为我们平常整理扑克牌的情形。接到牌的时候,牌的顺序是杂乱的,我们将其一张一张整理好,最后呈现的就是从小到大的顺序。回顾我们整理扑克牌的过程,从杂乱的牌堆中一张一张抽取扑克牌,放入手中,并且放入适合的位置,直到所有的扑克牌都整理完毕。

  由此得到插入排序算法的伪代码如下:

for j : 1 to length[A]-1
  do key = A[j]
    i = j - 1
    while i > 0 and A[i] > key
      do A[i + 1] = A[i]
        i = i - 1
    A[i + 1] = key 

对于实例A[5, 2, 4, 6, 1, 3]C++实现插入排序。

#include 

int main(void)
{
    int A[6]={5, 2, 4, 6, 1, 3};
    int key = 0;
    int i = 0;

    for (int j = 1; j < 6; j++)
    {
        key = A[j];
        i = j - 1;
        while (i >= 0 && A[i] > key)
        {
            A[i + 1] = A[i];
            i--;
        }
        A[i + 1] = key;
    }
    for (int i = 0; i < 6; i++)
        std::cout << A[i] << " ";

    return 0;
}


  书中练习2.2-2中提到了选择排序,再次比喻为整理扑克牌情形,从牌堆中寻找最小的那张牌依次放入手中,最后得到的就是有序的牌。

  选择排序的伪代码如下:

for j : 0 to length[A] - 1
  do key = A[j]
    i : j+1 to length[A]-1
      if A[i] < key
        A[i] <->key

C++实现某一示例无序数组。

#include 

int main(void)
{
    int A[6]={5, 2, 1, 3, 6, 4};
    int key = 0;
    int keyid = 0;
    int i = 0;

    for (int j = 0; j < 6; j++)
    {
        key = A[j];
        for (i = j + 1; i < 6; i++)
        {
            if (A[i] < key)
            {
                key = A[i];
                keyid = i;
            }
        }
        A[keyid] = A[j];
        A[j] = key;
    }
    for (i = 0; i < 6; i++)
        std::cout << A[i] << " ";

    return 0;
}

这两种排序算法不适用于比较庞大的数据。

你可能感兴趣的:(算法与数据结构,算法的二三事)