《算法图解》第二章笔记与课后练习

软件环境:Python 3.7.0b4

一、选择排序

# 找出数组中的最小元素
def findSmallest(arr):
  # 存储最小的值
  smallest = arr[0]
  # 存储最小元素的索引
  smallest_index = 0
  for i in range(1, len(arr)):
    if arr[i] < smallest:
      smallest_index = i
      smallest = arr[i]
  return smallest_index

# 排序算法
def selectionSort(arr):
  newArr = []
  for i in range(len(arr)):
      # 找出数组中最小的元素,并将其加入到新的数组中
      smallest = findSmallest(arr)
      newArr.append(arr.pop(smallest))
  return newArr

二、课后练习

答案(如果有更好的欢迎评论或私信~)

2.1:每天都在列表中添加支出项,但每月只读取支出一次。而数组的读取速度很快,但插入速度慢;链表的读取速度慢,但插入速度快。因为我们执行的插入操作比读取操作多,因此使用链表合适。

2.2:经常要执行插入操作——服务员添加点菜单,而链表的插入速度很快;而且不需要执行查找和随机访问操作(这是数组擅长的),因为厨师总是从队列中取出第一个点菜单。综上所述,使用链表合适。

2.3:有序数组。数组让你能够随机访问从而立即获取数组中间的元素,而使用链表无法这样操作。要获取链表中间的元素,就必须从第一个元素开始,沿链接逐渐找到这个元素。

2.4:数组的插入速度很慢。另外如果要使用二分查找算法来查找用户名,数组必须是有序的,因此每次插入用户名后,都必须对数组进行排序。

2.5:查找时,其速度比数组慢,但比链表快;而在插入时,其速度比数组快,但与链表相当。因此,除了查找速度比数组慢,其他方面并不比链表慢。

三、小结

  • 需要存储多个元素时,可使用数组或链表。
  • 数组的元素都是连在一起的,就像一节节车厢。
  • 链表的元素是分散开的,其中每个元素都存储了下一个元素的地址。
  • 数组的读取速度很快。
  • 链表的插入和删除的速度很快。
  • 在同一个数组中,所有元素的类型都必须相同(都为int、double等)。

原文地址:https://www.cnblogs.com/OctoptusLian/p/9026874.html

时间: 2024-11-19 19:17:22

《算法图解》第二章笔记与课后练习的相关文章

算法导论 第二章

2014-12-02 20:21:40 http://www.cnblogs.com/sungoshawk/p/3617652.html 上面链接指向算法导论第二章的预习博客,很值得一看,很详细. 插入算法: 1 #include <iostream> 2 3 using namespace std; 4 void insert_sort(int *datas, int length); 5 int main() 6 { 7 int a[10]={1,2,4,35,6,1,4,7,9,7};

PRML第二章笔记

这是关于PRML第二章的学习笔记.主要从内容思想的理解,具体的理论推导需要结合原文以及概率论的知识.这一章主要讲概率分布,概率分布的?个作?是在给定有限次观测x1, - , xN的前提下,对随机变量x的概率分布p(x)建模.这个问题被称为密度估计,分为二元 多元 高斯 以及先验分布 beta 狄利克雷分布,最后将这些分布统一到指数簇家族一类中. 引言:概率分布分为两个经典学派,频率学派和贝叶斯学派. 频率学派关注数据,认为数据是不会说谎的,一切以数据为中心,采用最大似然函数来求取data 的概率

算法设计第二章总结

第二章是递归和分治策略,通过Hanoi塔问题.排列问题等学习递归的思想,通过二分搜索算法.大整数乘法等学习了分治法的思想,并学习了归并排序和快速排序两种排序方法.PTA上的问题一是找第k小的数,用到了快速排序的方法对数组进行排序,同时在寻找第k小的数时递归调用int find(int a[],int left,int right,int k)函数,从而找出k.写代码过程中遇到的问题是在main函数中left与right赋值出错,导致程序运行程序超时错误及段错误,改正后程序可正常运行.问题二是求逆

《算法图解》第三章笔记与课后练习

软件环境:Python 3.7.0b4 一.基线条件和递归条件 由于递归函数调用自己,因此编写这样的函数时很容易出错,进而导致无限循环.例如: def countdown(i): print(i) countdown(i-1) countdown(5) # 测试数据 当我们编写递归函数时,必须告诉它何时停止递归.所以,每个递归函数都有两部分: 基线条件(base case):函数调用自己. 递归条件(recursice case):函数不再调用自己,从而避免无限循环. def countdown

算法导论 第二章作业

//作业2. 1-2 template<class T> void insert(T* A, int  n) { for (int j = 1; j < n; ++j) { T key = A[j]; int i = j - 1; while (i >= 0 && key > A[i]) { A[i + 1] = A[i]; --i; } A[i + 1] = key; } } //2. 1-3 template<class T> void fin

Python算法教程第二章知识点:计时模块、字典与散哈希表、图与树的实现、成员查询、插入对象

本文目录:一.计时模块:二.字典与散哈希表:三.图与树的实现:四.成员查询:五.插入对象</br>一.计时模块(timeit.cProfile) import timeit timeit.timeit('x = 1 + 2') 既然学习算法,那么来计算程序所耗费的时间是重要的,但是需要注意:timeit()计时函数会多次运行相关的代码段并求得平均值,以提高计时的精准度,所以,我们需要预防早先的执行操作影响之后代码的执行.举个栗子:若我们执行排序算法,则只有第一次执行代码时是在随机的情况下计时,

Java数据结构与算法(第二章数组)

数组是应用最广泛的数据存储结构.它被植入到大部分编程语言中. Java中数组的基础知识     创建数组 在Java中把它们当作对象来对待,因此在创建数组是必须使用new操作符:     int[] intArray;            //defines a reference to an array     ingArray = new int[100];    //creates the array, and                                  //set

《python编程》第二章笔记

本章讲了python的系统模块,也就是sys和os模块. 唯一的代码可以用来输出文档内容. 还有一些关于字符串的基本操作.用时再查. 讲了一些文件操作的基本知识,实际用时可以简单的调用就行了.同时介绍了一些不同操作系统命令行操作 os.path是目录相关的工具,简单来说,就是os.path.xxx()可以用来处理目录. shell指的是操作命令行的系统,在有ui的系统中,windows中就是MS-DOC,linux中就是别的. 虽然python可以跨系统,但是有些命令是只能在特定系统下运行的.

【算法导论第二章】算法基础

2.1插入排序 扑克牌这个栗子不错.以后得多用扑克牌来形象化思考排序问题. 根据伪代码用java实现插入排序 package com.panjn.java; /** * Created by panjianning on 2016/7/10. */ public class InsertionSort { public static void main(String[] args) { int[] array = new int[]{1, 3, 5, 7, 9, 2, 4, 6, 8, 10};