每日一题(二十)

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

dfdu 表面意思都差不多,都是查看使用空间的,不同的是 df 是显示磁盘使用空间,du 是先试试文件和目录磁盘使用空间,具体消息如下:

df

  • 显示当前磁盘的使用情况,显示的信息包括硬盘的大小、使用的大小、使用的百分比、剩余的空间、文件系统类型
  • 如果对df命令指定文件夹,会显示文件夹所在硬盘的使用情况
  • 如果没有文件名被指定,则会显示当前被挂载的文件系统的空间使用情况
  • 默认情况下,会以1KB为单位进行显示,可以通过指定环境变量POSIXLY_CORRECT来以512Byte为单位进行显示
-a 全部文件系统列表
-h 以方便阅读的方式显示信息
-i 显示inode信息
-k 区块为1024字节
-l 只显示本地磁盘
-T 列出文件系统类型

image-20201205073110687

du

  • du是专门显示文件和目录的大小的,不区分是哪个硬盘下的,也不区分是什么文件系统
  • 默认显示目录的大小,是递归显示的
  • 可以通过指定文件来显示文件的大小
  • 可以控制显示目录的递归层数
  • 可以分布显示多个文件、目录的大小,并计算总和
-a 显示目录中所有文件大小
-k 以KB为单位显示文件大小
-m 以MB为单位显示文件大小
-g 以GB为单位显示文件大小
-h 以易读方式显示文件大小
-s 仅显示总计
-c 或--total  除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和

image-20201205074041958

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值