归并排序属于分治法思想,归并排序完全遵循分治模式。直观上其操作如下:

  • 分解:分解待排序的n个元素成各具n/2个元素的两个子序列。
  • 解决:使用归并排序递归地排序两个子序列。
  • 合并:合并两个已排序的子序列以产生已排序的数组。

核心函数有两个,merge(A,p,q,r):将已经有序的序列 A[p…q]和A[q+1,r] 合并为一个有序序列。

阅读全文 »

Linux系统中用户和权限

三种不同类型的用户:文件拥护者(user),同组用户(group),可以访问系统的其他用户(others)。
三种访问文件或目录的方式:可读文件(r),可写文件(w),可执行文件(x)。

在shell环境中执行ls -la 输出当前目录的详细信息

阅读全文 »

当输入规模足够大,使得运行时间只与增长量级有关时,需要研究算法的渐近效率。也就是,当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加。本文中所用插图来自《算法导论》。

不同的记号从不同的方面来刻画一个算法的运行效率。将插入排序的最坏运行时间刻画为下式:

阅读全文 »

Makefile 作用

Makefile的作用为实现自动化编译,主要为了解决以下问题:

  • 有很多源文件需要编译时
  • 当存在很多源文件时,只修改了个别源文件,这时只需要编译修改过的文件即可,而无需整个项目都编译一遍。
  • 当多个源文件存在依赖关系时,需要先编译一些文件,后编译一些文件

Makefile安装

阅读全文 »

分别用递归和迭代实现二叉树三种遍历方式:前序遍历,中序遍历,后序遍历。递归的缺点分析。

阅读全文 »

本文包含以下内容:

  • 二叉树概念
  • 使用 C 语言 实现的二叉查找树的动态集合操作:
    • 构造:使用二叉树的前序遍历构造二叉树。
    • 插入,删除,查询
    • 前驱和后继
    • 最大值和最小值
  • 红黑树的概念
阅读全文 »

快速排序使用分治法实现,即一个一个复杂的问题分解为一系列容易解决的小问题,最终得到问题的解。

算法步骤

快速排序的三步分治过程:例如对 A[p…r] 进行快速排序

  1. 分解:数组 A[p…r] 被划分为两个(可能为空)子数组 A[p…q-1] 和 A[p+1…r],使得A[p…q-1] 中的每一个元素都小于 A[q],而 A[q] 也小于等于 A[q+1…r]中的每个元素。其中,计算下标 q 也是划分过程的一部分。
  2. 解决:通过递归调用快速排序,对子数组A[p…q-1] 和 A[p+1…r] 进行排序。
  3. 合并:因为子数组都是原址排序,所以不需要合并操作,数组A[p…r]已经有序
阅读全文 »

umask命令

说明

umask命令指定在建立文件时预设的权限掩码。由3位八进制数字组成。
查看当前系统的文件掩码:umask -S

阅读全文 »

函数定义

1
2
3
4
5
6
7
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
阅读全文 »

文件标记 Ascii 含义
‘\n’ 10 换行
‘\0’ 0 c语言中表示字符串结束符
EOT 4 传输结束符

**EOF(End of File)**是一个宏定义,其真实值根据不同平台有差异,通常为-1。表示操作系统无法从数据源获取更多数据的情况,数据源一般为文件或流。

**EOT(End-of-Transmission)**传输结束字符,是一个控制字符,表示传输的结束。ascii码为04

‘\n’ 在文本文件中,除了最后一行,其余的每一行行尾都有一个换行符,即’\n’,ascii码为10

‘\0’ 等价于NULL,在c语言中,并不存在真正的字符串类型。c语言中的字符串其实是char*指向的地址到’\0’前的字符,字符串的长度并不包括’\0’。例如:

1
2
char *s = "hello\0world";			//表示字符串 hello \0位字符串结束符      
printf("%s",s); //输出hello
0%