文章目录
12.1 快速排序
所有查找中Hash查找效率最高,在所有排序中,快速排序的效率也是最高的。
采用递归函数的方法来实现快速排序!
- 先把递归框架搭建起来!!!
- 递归框架,首先确定终止条件,那就是当
low >= hight
的时候!!! - 然后确定递归操作,已经知道每一次拆分会产生两个区间,又要对两个区间各自进行拆分!
- 对于拆分操作,输入的是列表和low、hight,返回的是拆分好后,基准值的下标!!!
- 对于拆分出来的两个区间的再次拆分,根据上次拆分的基准值下标来确定这两个区间的low、hight
- 在拆分的时候,low和hight都往中间靠拢,最后low和hight是要重合的,这个重合的位置就是基准值要存放的位置,也是要返回的位置.
- 外层的循环在内层循环中还要考虑。
- 当low与hight交换之后,接着从另一端开始继续遍历
- 判断的时候是利用基准值tmp判断,交换的时候却是low和hight位置上的交换
代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int quick_sort(int *, int , int);
int partion(int *, int, int);
int main(int argc, const char* argv[])
{
int i, n;
printf("input the num:");
scanf("%d", &n);
int *num = (int*)malloc(sizeof(int) * n);
srand((unsigned)time(NULL));
for (i = 0; i < n; i++) {
num[i] = rand() % 100;
}
printf("the rand num is:");
for (i = 0; i < n; i++) {
printf("%2d ", num[i]);
}
puts("");
quick_sort(num, 0, n-1);
printf("quick_sort num :");
for (i = 0; i < n; i++) {
printf("%2d ", num[i]);
}
puts("");
free(num);
return 0;
}
int quick_sort(int *num, int low, int hight)
{
int i; //记录基准值下标
if (num == NULL) {
printf("num is NULL!\n");
return -1;
}
if (low >= hight)
return 0;
i = partion(num, low, hight); //拆分操作
quick_sort(num, 0, i - 1); //左区间排序
quick_sort(num, i + 1, hight); //右区间排序
return 0;
}
int partion(int *num, int low, int hight)
{
int tmp = num[low]; //基准点要先保存好
while (low < hight) {
while ((low < hight) && (tmp <= num[hight])) { //始终与基准值比较
hight--;
}
num[low] = num[hight]; //找到要交换的就之间交换
while ((low < hight) && (tmp >= num[low])) { //交换之后就从另一端开始比较
low++;
}
num[hight] = num[low];
}
num[low] = tmp; //low hight重合的时候就是说基准值的位置
return low; //返回基准值的最终位置
}
12.2 二叉树的遍历
二叉树是非线性结构,每个节点有两个后继节点,所以会存在以多种不同的方式来遍历。
由于二叉树是具有递归性质的,所以二叉树的遍历算法也是递归的。
二叉树的遍历始终是输出当前根节点的值,只是输出的次序可能不一样。
先序遍历
先输出根,然后输出左子树,最后输出右子树。
所以在先序遍历的时候,也是采用递归的方式。
先输出当前的根,然后访问当前的左子树,然后访问当前的右子树,当 当前的根为NULL(也就是当前的节点为空),作为这一分支递归的结束。
注意!!!先序遍历的每次的递归都是输出根的值,因为是先序遍历,而且每个节点在当前看来都是根节点。
void preorder(bitree * r) {
if (r == NULL) {
return;
}
printf("%c", r->data);
preorder(r->left);
preorder(r->right);
}
中序遍历
void inorder(bitree * r) {
if (r == NULL) {
return;
}
inorder(r->left);
printf("%c", r->data);
inorder(r->right);
}
后序遍历
void postorder(bitree * r) {
if (r == NULL) {
return;
}
postorder(r->left);
postorder(r->right);
printf("%c", r->data);
}
12.3 按字符输入输出
按字符输入
按字符输入的函数原型如下:
#include <stdio.h>
int fgetc(FILE *stream); //函数,从FILE流中读取一个字节内容,返回读取到的值,出错或者文件读完返回EOF
int getc(FILE *stream); //宏定义,从FILE流中读取一个字节内容,返回读取到的值,出错或者文件读完返回EOF
int getchar(void); //函数,默认从stdin流中读取一个字节内容,返回读取到的值,出错或者文件读完返回EOF
其中要注意的是:
- fgetc(stdin)相当于getchar(),两者都是函数
- getc是宏定义
按字符输出
按字符输出的函数原型如下:
#include <stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
注意:
- 写入成功时返回写入的字符,失败时返回EOF
- 只有putc是宏定义
- putchar©相当于fputc(c, stdout)
12.4 Linux 进程间通信的方式
- 管道(pipe)、有名管道(FIFO)、流管道(s_pipe)
- 信号(signal)
- 消息队列
- 信号量
- 共享内存
- 套接字(socket)
12.5 磁盘管理命令 du df
df
与du
表面意思都差不多,都是查看使用空间的,不同的是 df
是显示磁盘使用空间,du
是先试试文件和目录磁盘使用空间,具体消息如下:
df
- 显示当前磁盘的使用情况,显示的信息包括硬盘的大小、使用的大小、使用的百分比、剩余的空间、文件系统类型
- 如果对
df
命令指定文件夹,会显示文件夹所在硬盘的使用情况 - 如果没有文件名被指定,则会显示当前被挂载的文件系统的空间使用情况
- 默认情况下,会以1KB为单位进行显示,可以通过指定环境变量POSIXLY_CORRECT来以512Byte为单位进行显示
-a 全部文件系统列表
-h 以方便阅读的方式显示信息
-i 显示inode信息
-k 区块为1024字节
-l 只显示本地磁盘
-T 列出文件系统类型
du
du
是专门显示文件和目录的大小的,不区分是哪个硬盘下的,也不区分是什么文件系统- 默认显示目录的大小,是递归显示的
- 可以通过指定文件来显示文件的大小
- 可以控制显示目录的递归层数
- 可以分布显示多个文件、目录的大小,并计算总和
-a 显示目录中所有文件大小
-k 以KB为单位显示文件大小
-m 以MB为单位显示文件大小
-g 以GB为单位显示文件大小
-h 以易读方式显示文件大小
-s 仅显示总计
-c 或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和