整理文档.

Signed-off-by: lion.chan <cy187lion@sina.com>
This commit is contained in:
lion.chan 2022-05-02 22:08:56 +08:00
parent b1e52f059b
commit 42f22a8f4d
3 changed files with 35 additions and 10 deletions

View File

@ -4,7 +4,13 @@
常见的三种排序算法为:冒泡排序、选择排序和快速排序。在讲解排序和查找等算法时,往往以数组为对象,但这些算法的应用对象并不仅限于数组。
## 4.2.1 选择排序
## 4.2.1 冒泡排序
俩俩交换
比较和交换次数O(N^2)
## 4.2.2 选择排序
选择排序是最简单,也是最容易理解的排序算法。其思想是:每次都从待排序的元素中选取最大/最小的元素,加入到已排序的列表中,直到没有待排序的元素为止。
@ -22,18 +28,23 @@
接着选取 1 号元素 E将 E 与 2-5 号元素进行比较、选取和交换。接着从 2 号元素开始...直到没有再需要被排序的元素为止。
## 4.2.2 冒泡排序
比较次数O(N^2)
交换次数O(N)
俩俩交换
## 4.2.3 插入排序
比较和交换次数O(N^2),一般情况下比冒泡排序快一倍,比选择排序还要快一点。
## 4.2.3 快速排序
基本有序
快速排序是一种常用的排序算法。比选择排序算法快。例如C语言标准库中的函数 qsort 实现的就是快速排序。快速排序也使用了D&C。
快速排序是一种常用的排序算法。比选择排序算法快。例如C语言标准库中的函数 qsort 实现的就是快速排序。快速排序也使用了 D&C。
下面来使用快速排序对数组进行排序。对排序算法来说,最简单的数组什么样呢?还记得前一节的“提示码?就是根本不需要排序的数组。
大多数情况下执行时间为O(N*logN)
## 练习
编码实现快速排序算法。

View File

@ -16,7 +16,21 @@
从整个上电和引导流程来看,引导技术的关键就是修改程序指针到特定地址去执行下一阶段的程序。而在这之前,又要能够将下一阶段程序加载到内存中,并且准备好其运行环境,比如分配内存空间等。另外,对于引导系统而言就是要提供某些用户功能,比如命令行交互,串口、以太网和外部存储器的的驱动等,甚至是加载文件系统,当然也要准备好对应的中断资源。
引导系统体现的是从实际问题出发,实事求是的解决主要矛盾的核心思想。比如,最初的 x86 系统,其刚启动时,硬件只会加载磁盘第一个扇区并引导其运行,这一扇区中的程序又要能够继续访问外部存储器,加载后续程序,准备其运行环境,并执行之。这就要求这段程序必须十分简洁,并且整个引导系统都要进行合理的设计。
引导系统体现的是从实际问题出发,实事求是的解决主要矛盾的核心思想。比如,由于硬件能力有限,最初的 x86 系统,其刚启动时,硬件只会加载磁盘第一个扇区并引导其运行,这一扇区中的程序又要能够继续访问外部存储器,加载后续程序,准备其运行环境,并执行之。这就要求这段程序必须十分简洁,并且整个引导系统都要进行合理的设计。
## 软件引导阶段
如前文所述,软件引导可以分为多个阶段。对于基于 x86/64 的 Linux 系统,通常由 BIOS/UEFI 引导,然后交由 GRUB 进行后续引导,最后将控制权交给内核。
而对于基于 ARM 的 Linux 系统,通常先由硬件厂商定制的引导程序引导,然后交由 UBoot 等进行第二阶段引导。
### 第一阶段引导
对于一些 ARM 系统,其引导程序以二进制形式直接烧录于外部的 SPI Flash。加载这种引导程序不需要复杂的外存控制器驱动也不需要文件系统来支撑对于资源有限的硬件引导程序来说这种设计比较实际。
基于 ARM 的 SOC 通常可选多种启动和引导方式,比如 Flash 启动或 SD 卡启动等,因此其第一阶段软件引导程序的形式也比较多样。
### UBoot
## 内核镜像类型