技术宅工作吧 关注:98贴子:1,582

【教程】学算法 带你装b带你飞

只看楼主收藏回复

一楼敬所有码农 程序猿
图灵在上


1楼2015-07-13 16:13回复
    算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。 ----必应百科
    算法是程序的灵魂。 ---孟社长
    简单的说,算法就是把“做什么”描述成“怎么做”的过程,用一系列计算机语言描述解决一类问题的普遍方法。
    本帖不涉及语言内容 算法描述语言为c++/java
    Java教程 @zblygbl


    2楼2015-07-13 16:19
    回复
      【7.13更新】初识算法
      今天我们来认识算法 请看问题描述
      例题 1.1 最大值(max)
      输入10个数(int),输出他们中的最大值。
      算法分析 输入10个数据,我们可以用数组a储存起来。首先假设第一个a1为最大值,遍历数组,一旦值大于a1,则将最大值更新为此值。输出最大值。算法结束。
      示例程序
      //c++
      #include <iostream>
      using namespace std;
      int main(){
      int a[10];
      int max; //最大值
      for (int i=0; i<10; i++)
      cin >> a[i]; //c++数组下标从0开始
      max=a[0];
      for (int i=1; i<10; i++){
      if (a[i]>max) max=a[i];
      }
      cout << max;
      return 0;
      }


      3楼2015-07-13 16:45
      收起回复
        今天的课后题 触类旁通
        1,输入十个数据 输出最小值
        2,输入十个数据 输出第一个大于10的值


        来自Android客户端4楼2015-07-13 17:14
        回复
          明天开始正式开讲 先讲3种排序算法


          来自Android客户端5楼2015-07-13 17:16
          回复
            【7.14】冒泡排序
            冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
            它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
            这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
            ----度娘


            来自Android客户端6楼2015-07-14 07:00
            回复
              分析 两层循环 外层控制n-1趟冒泡 内层两两比较


              来自Android客户端7楼2015-07-14 07:08
              收起回复
                算法分析 设有数列a={1,3,2,0,0}
                第一趟冒泡:
                1 比较 a1 a2 1<3 不交换
                2 比较 a2 a3 3>2 交换 数列变为 {1,2,3,0,0}
                3 比较 a3 a4 3>0 交换 变为 {1,2,0,3,0}
                4 比较 a4 a5 3>0 交换 变为 {1,2,0,0,3}
                这样 经过一趟冒泡排序 最大值3就“浮”到了数列顶端
                由此易得an经过至多(n-1)趟冒泡就可以将原数列排序
                这个过程请各位自己比划比划


                8楼2015-07-14 09:32
                回复
                  读入的数据用数组存放起来 再按上面的方式进行n-1趟冒泡 再输出即可
                  代码 c++
                  #include <iostream>
                  using namespace std;
                  int main(){
                  int a[100];
                  int n; //个数
                  int temp; //交换辅助空间
                  cin >> n; //输入待排序数据个数
                  for (int i=0; i<n; i++)
                  cin >> a[i]; //输入数据
                  for (int i=0; i<n-1; i++) //n-1次冒泡
                  for (int j=0; j<n-1; j++){
                  if (a[j] > a[j+1]){ //a[j]<a[j+1]则交换
                  temp = a[j];
                  a[j] = a[j+1];
                  a[j+1] = temp; //交换数值
                  }
                  }
                  for (int i=0; i<n; i++)
                  cout << a[i] << " "; //输出
                  return 0;
                  }
                  代码下载
                  htt删p://yun.bai字du.com/share/link?shareid=427234429吧9&uk=3811683084
                  ————————————————————————————————————————
                  效果:


                  9楼2015-07-14 09:44
                  回复
                    番外篇 培养效率意识
                    现在java c# 兴起, 让程序猿可以轻松写出程序 但往往忽视效率。程序的运行效率分为两部分,一部分是算法本身的效率,另一部分是语言的效率。现在我们只讨论算法本身效率。
                    同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。 计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。
                    比如我们分析冒泡排序的时间复杂度。主算法两层循环,要运行(n-1)(n-1)次。展开并降幂排列n^2-2n+1,去除低阶项和首项系数,时间复杂度为O(n^2)。可以理解为,这个程序的运行时间,同(n^2)的大小有密切关系。当输入数据量趋近无穷时,n^2基本可以反映程序的运行效率。


                    10楼2015-07-14 09:53
                    收起回复
                      @mengyapeng1 @zblygbl @祎语默然 @2002a1116


                      11楼2015-07-14 10:06
                      收起回复
                        内容再多点更到40楼就给你加精干巴爹!
                        【然而我我我我并没有看懂多少。。。。


                        IP属地:浙江来自Android客户端12楼2015-07-14 11:24
                        收起回复
                          课后练习
                          降序排序(sort)
                          输入20个数据,将其降序排列。
                          提示 冒泡排序交换条件


                          来自Android客户端13楼2015-07-14 12:16
                          回复
                            【伟人专题】 冯·诺依曼(John von Neumann,1903~1957)
                            原籍匈牙利。布达佩斯大学数学博士。先后执教于柏林大学和汉堡大学。1930年前往美国,后入美国籍。历任普林斯顿大学、普林斯顿高级研究所教授,美国原子能委员会会员。美国全国科学院院士。早期以算子理论、量子理论、集合论等方面的研究闻名,开创了冯·诺依曼代数。第二次世界大战期间为第一颗原子弹的研制作出了贡献。为研制电子数学计算机提供了基础性的方案。1944年与摩根斯特恩(Oskar Morgenstern)合著《博弈论与经济行为》,是博弈论学科的奠基性著作。晚年,研究自动机理论,著有对人脑和计算机系统进行精确分析的著作《计算机与人脑》。


                            来自Android客户端15楼2015-07-14 13:07
                            回复
                              【7.15】选择排序 改进时间复杂度之路


                              来自Android客户端16楼2015-07-15 11:50
                              回复