第七期 计算机科学家的算法思维

MidYouth

  1. 讲师:李浩然


1. 算法简介

1.1 什么是算法

1.2 算法的例子

求 498 * 9 的结果
- 498 * 9 = 3600 + 810 + 72 = 4482
- 498 * 9 = 500 * 9 - 2 * 9 = 4482

不同的算法有着不同的效率,但是完成的任务是相同的。

1.3 算法的意义

  1. 效率:占用更少的系统资源(内存、CPU、硬盘读写等),从而达到更高的程序运行效率,达到更高的经济效益。
  2. 安全:加密算法可以提高网络信息的安全性。
  3. 智能:人工智能算法将成为下一步计算机性能发展的一大方向。

2. 基础算法:找到列表中的最大值

  1. ls = [ 81, 94, 92, 71, 98, 87 ]
  2. max = ls[0]
  3. for i in range( 1, len(ls) ):
  4. if ls[i] > max:
  5. max = ls[i]
小练习 1

找出如下列表中的最小值:

  1. >>> ls = [ 81, 94, 92, 71, 98, 87 ]
小练习 2

求如下列表所有项的和:

  1. >>> ls = [ 81, 94, 92, 71, 98, 87 ]

如果你有认真听我讲的第五期课程:数据结构,你应该知道以上三个问题都可以分别用一个方法实现。在这里还是希望大家能够将这几个题的算法写出来,从而对算法更加熟悉。

3. 排序算法:将杂乱的一组数据按顺序排列

3.1 冒泡排序 (Bubble Sort)

  1. ls = [30, 50, 10, 20, 40]
  2. n = len(ls)
  3. for i in range(n):
  4. for j in range(0, n-i-1):
  5. if ls[j] > ls[j + 1]:
  6. ls[j], ls[j + 1] = ls[j + 1], ls[j] # 两项互换位置
  1. # 在以上的代码中,最后一行代码也可以用另外一种更为常见的方式实现。
  2. temp = ls[j]
  3. ls[j] = ls[i]
  4. ls[i] = temp
  5. # 他们本质上并没有什么区别,只是写法不同而已。

3.2 选择排序 (Selection Sort)

  1. ls = [30, 50, 10, 20, 40]
  2. n = len(ls)
  3. for i in range(n):
  4. index_of_min = i
  5. for j in range(i + 1, n):
  6. if ls[j] < ls[index_of_min]:
  7. index_of_min = j
  8. ls[i], ls[index_of_min] = ls[index_of_min], ls[i]

3.3 时间复杂度

3.3.1 计算冒泡排序的时间复杂度

  1. (n - 1) + (n - 2) + (n - 3) + ... + 3 + 2 + 1
  2. = (n - 1 + 1) + (n - 2 + 2) + (n - 3 + 3) + ... + (n - n + n)
  3. = (n - 1) * n / 2

3.3.2 计算选择排序的时间复杂度

  1. (n - 1) + (n - 2) + (n - 3) + ... + 3 + 2 + 1
  2. = (n - 1 + 1) + (n - 2 + 2) + (n - 3 + 3) + ... + (n - n + n)
  3. = (n - 1) * n / 2

3.3.3 常见的排序算法的时间复杂度

排序算法 时间复杂度
冒泡排序 O(n^2)
选择排序 O(n^2)
...... ......
归并排序 O(n*logn)
插入排序 O(n^2)
希尔排序 O(n^1.25)

4. 查找算法:在已经排序好的一个列表里面找出来匹配的值

  1. ls = [ 10, 20, 30, 40, 50, 60, 70 ]
  2. # 查找数字 50
  3. index = -1
  4. for i in range(len(ls)):
  5. if ls[i] == 50:
  6. index = i # 数字 50 在索引 index 上
  1. ls = [10, 20, 30, 40, 50, 60, 70]
  2. low_index = 0
  3. high_index = len(ls) - 1
  4. middle_index = int((low_index + high_index) / 2)
  5. while low_index < high_index:
  6. if ls[middle_index] > 50:
  7. high_index = middle_index - 1
  8. middle_index = int((low_index + high_index)/2)
  9. elif ls[middle_index] < 50:
  10. low_index = middle_index + 1
  11. middle_index = int((low_index + high_index)/2)
  12. else:
  13. break
  14. middle_index # 4

5. 课后作业

在这个作业中,我将会给大家提供一个 python 文件,开头是三个长度为一万的列表,格式分别为正序、倒序和随机。请大家写出来一个程序,将这三个列表分别用冒泡排序算法(请写出来)、选择排序算法(请写出来)和归并排序算法(代码会提供)排序,并记录程序运行的时间。

请大家将自己写的代码以及代码的运行结果发给我,然后对结果进行分析。想怎么分析就怎么分析,但是我会打分的哦~