算法导论学习笔记 -(1)

一个ACM若菜,趁着ACM淡季,开始学习算法导论了,经过一年的ACM学习,逐渐的发现,学东西,深入才是王道,以前学习一个算法,总是看懂了就开始做题,到后来才发现很多题目,会算法,却不知道是用这个算法,这就是算法理解的不到位的后果,从今天开始,定下目标:

1.深入系统的学习算法,

2.学会纸上写伪代码,每章的代码自己先在纸上写一遍,

3.每节的学习笔记和算法都要写在博客上。

在博客上记录自己的学习笔记,方便以后温习.   欢迎各路大神路过指正错误之处。

现在,先写写书上的第一个算法,插入排序。

算法思想:对于一个数组A,如果A[0~j-1]已经为有序序列,那么对于第j位来说,只需要依次更A[j-1~0]比较,如果A[j]更小,就把当前比较的数往后挪一位,最后把A[j]放入空位中,下面为代码。

现在给出下面代码的正确性证明:

1. 当j = 1的时候,A[0~j-1]的数只有A[0], 此时显然A[0]是一个已排序的序列,在A[1]与A[0]进行比较之后,A[0~1]变成了一个有序序列。

2. 假设满足A[0~j-1]为有序序列,那么当迭代j的时候, A[j]会与A[j-1 ~ 0]依次比较并把比A[j]小的依次往后挪,最后把A[j]放入对应位置,于是A[0~j] 变又成了一个有序序列, 然后j+1,进行下一次迭代。

3. 当循环跳出的时候,因为每次j都会+1,于是j = n, 此时由2可得出,A[0~n-1]为有序序列,并且A[0~n-1]为完整的序列,于是算法正确。

//insertion_sort
#include <iostream>
using namespace std;

void insertion_sort(int* A, int n)
{
    for (int j = 1; j < n; j++)
    {
        int key = A[j];
        int i = j-1;
        //Insert A[j] into the sorted sequence A[0..j-1].
        while (i >= 0 && A[i] > key)
        {
            A[i+1] = A[i];
            i--;
        }
        A[i+1] = key;
    }
}
void print(int* A, int n)
{
    for (int i = 0; i < n; i++) {
        cout << A[i] << " ";
    }
    cout << endl;
}
int main()
{
    int A[10] = {43,2,53,1,8,29,52,4,8,10};
    
    cout << "before sorted: ";
    print(A, 10);
    
    insertion_sort(A, 10);
    
    cout << "after sorted: ";
    print(A, 10);
    
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机科学导论是计算机科学专业的入门课程,它涵盖了计算机科学及其相关领域的基本概念、基本理论和基本技术。以下是一些学习笔记,希望对您有所帮助: 1. 计算机科学的定义: 计算机科学是研究计算机及其在信息处理中的应用的学科,它涉及计算机硬件、软件、算法、数据结构、数据库、网络、人工智能等方面的知识。 2. 计算机科学的历史: 计算机科学的发展经历了多个阶段,从最初的机械计算器到现代的超级计算机,计算机科学的发展一直在推动着人类社会的进步。 3. 计算机科学的基本概念: 计算机科学的基本概念包括:二进制、位、字节、字符、编码、算法、数据结构、程序、操作系统、编译器等。 4. 计算机科学的基本理论: 计算机科学的基本理论包括:图灵机、计算复杂性理论、自动机理论、信息论等。 5. 计算机科学的基本技术: 计算机科学的基本技术包括:计算机网络、数据库、人工智能、图形学、软件工程、计算机安全等。 6. 计算机科学的研究方法: 计算机科学的研究方法包括:实验研究、理论研究、模拟研究、仿真研究等。 7. 计算机科学的应用领域: 计算机科学的应用领域包括:信息技术、通信技术、金融、医疗、教育、交通、娱乐等。 以上是一些计算机科学导论的学习笔记,希望对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值