关于本课程
hi,少年。咱们来一起学习算法啦。这套课程特别适合自学算法的小白。每节课程最后还有一道练习题,边学边练,可以帮你及时巩固学习到的知识。
如果您在学习其他相关的算法课程,也可以学习该课程用来巩固知识点。
本教程中的练习题,请移步 1024乐学编程-算法基础 进行练习。
您也可以在该网站免费学习到更多课程
好,那我们正式开始!
算法,可以简单理解为,完成一个任务的方法。
你可以把它想象成食谱。要想做出一道菜肴,只需要按食谱的步骤一步步操作。
编程中的算法,就是用计算机解决一个问题的方法。
食谱和算法的最大区别,在于算法是严密的,只要遵循步骤就一定能解决特定的问题;而食谱经常会有模糊描述的部分,不同厨师按照一个食谱做出来的菜可能口味天差地别。
算法有优劣之分
算法也有优劣之分,如果让你在图书馆找到一本书
算法一:在图书馆乱逛,随便抓起一本书看是不是要找的,如果不是,就再逛到另一个地方,随便抓起一本书
算法二:从图书馆的第一排书架最顶层开始,从左到右,一本本地找。找完一层,再找下一层。如果整个书架找完了,就到下一个书架,再这样找。
算法三:根据图书的索引编号,到图书馆的特定区域(如文学区、科技区),找到编号对应的书架、在哪一层,然后从左到右一本本找到。
那肯定选择算法三! 效率最高。
时间复杂度
算法的优劣有很多体现,比如时间复杂度,空间复杂度,可读性和健壮性等等。
空间复杂度是指运行完一个程序所需内存的大小。一般来说,空间复杂度越小,算法越好。
时间复杂度用来衡量一个算法的运行时间和输入规模的关系,通常用 O表示。
简单计算复杂度的方法一般是统计“简单操作”的执行次数,有时候也可以直接数循环的层数来近似估计。
按增长量级递增排列,常见的时间复杂度有:
O(1)—常数阶
O(N)—线性阶
O(log2N)—对数阶
O(nlogn)—线性对数阶
O(n²)—平方阶
算这个时间复杂度实际上只需要遵循如下守则:
• 用常数1来取代运行时间中所有加法常数;
• 只要高阶项,不要低阶项;
• 不要高阶项系数;
O(1)的算法是一些运算次数为常数的算法。例如:
temp=a;
a=b;
b=temp;
根据守则:用常数1来取代运行时间中所有加法常数;
上面语句共三条操作,单条操作的频度为1,即使他有成千上万条操作,也只是个较大常数,这一类的时间复杂度为O(1);
O(n)的算法是一些线性算法。例如:
sum=0;
for(i=0;i<n;i++)
sum++;
上面代码中第一行频度1,第二行频度为n,第三行频度为n,所以f(n)=n+n+1=2n+1。
根据守则:只要高阶项,不要低阶项目,常数项置为1,去除高阶项的系数:
所以时间复杂度O(n)。这一类算法中操作次数和n正比线性增长。
之后我们会讲到二分查找的时间复杂度是O(Log2N);线性对数阶就是在LogN的基础上多了一个线性阶O(nlogn);
普通嵌套循环,它的时间复杂度为O(n²)。
for (int i = 0; i < n; i++) {//执行n次
for (int j = 0; j < n; j++) {//执行n次
}
}
插入排序
下面说们说一个简单的排序算法