作者文章归档:zuojie@88.com

C语言中的快速排序


快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。

#include <stdio.h>

void quickSort(int arr[], int left, int right) {
  if (left >= right) {
    return;
  }
  int pivot = arr[left];
  int i = left, j = rig...

Read more

C语言中的希尔排序


C语言中的希尔排序(Shell Sort)是一种改进的插入排序算法,它通过将数组分割成多个子序列来进行排序,并逐步缩小子序列的长度,最终完成整个数组的排序。下面是一个使用C语言实现的希尔排序算法的示例:

void shell_sort(int arr[], int len) {
    int gap, i, j, temp;
    for (gap = len/2; gap > 0; gap /= 2) {
        for (i = gap; i < len; i++) {
            temp = arr[i];
            for (j...

Read more

C语言直接插入排序


直接插入排序是一种简单的排序算法,算法思想是将未排序的数据依次插入到已经排序的数据中,从而得到一个完全有序的序列。下面是一个使用 C 语言实现的直接插入排序算法:

void insertion_sort(int arr[], int len) {
    int i, j, key;
    for (i = 1; i < len; i++) {
        key = arr[i];
        j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] ...

Read more

常用git命令快捷使用


#!/bin/bash

alias ga='git add .'
alias gb='git branch'
alias gba='git branch -a'
alias gbd='git branch -d'
alias gcv='git commit -v'
alias gca='git commit -v -a'
alias gcm='git commit -m'
alias gcb='git checkout -b'
alias gcf='g...

Read more

GCC与GDB


GCC简介

生成一份可执行程序要经过预处理,编译,汇编,链接这4个过程。

1.预处理功能主要包括宏定义,文件包含,条件编译,去注释等。

2.编译阶段是将代码转换为汇编码

3.汇编阶段生成机器可识别代码

4.链接阶段生成可执行文件或库文件。

gcc使用

格式:gcc [选项] 要编译的文件 [选项] [目标文件]
选项:
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-o 文件输出到文件
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared ...

Read more

Makefile快速入门


Makefile快速入门

设计得好的 Makefile,当我们重新编译时,只需编译那些上次编译成功后修改过的文件,而不是整个项目。

Makefile最为重要的是掌握二个概念,一个是目标(target),另一个就是依赖(dependency)。

目标就是指要干什么,或说运行 make 后生成什么,而依赖是告诉 make 如何去做以实现目标。

要学会采用目标和依赖关系来思考所需解决的问题。

Makefile三要素:

img

Makefile工作原理:

img

Makefile格式

# Makefile格式
# 目标:依赖
#    执行编译命令生成目标
target: depemdemcy
<...

Read more

QEMU


QEMU

QEMU简介,QEMU是运行在用户层的开源全虚拟化解决方案,可以在Intel x86机器上虚拟出完整的操作系统,其性质与VMware player类似,由于QEMU工作在用户层,所以很多硬件的特权指令、内核操作无法实现,所以在性能上表现比较差,一般都会配合使用KVM作为底层接口来完成虚拟化。

​ QEMU主要提供两种功能给用户使用:一是作为用户态模拟器,利用动态代码翻译机制来执行不同于主机架构的代码;二是作为虚拟机监管器,能模拟整个计算机系统,包括中央处理器及其他周边设备,它使得为跨平台编写的程序进行测试及除错工作变得容易。

​ QEMU在模拟全系统时,能够利用...

Read more

自制操作系统(一) Hello, OS World!


今天开始学习自制操作系统课程,任务是搭建实验环境和简单了解汇编基础语法。 本次使用环境版本如下: /img/image-20231206181209298.png

  • Ubuntu 23.10
  • VScode 1.84.2
  • VirtualBox 7.0.6

如果使用Windows环境建议安装msys2或WSL,以便在Windows中使用Linux命令工具。

安装nasm汇编工具

# ubuntu安装nasm汇编编译器
sudo apt install nasm
# 也可以在Windows+msys2环境中使用pacman包管理器安装
# pacman -S nasm
nasm -v
# 显示版本表示安装完成
NASM version 2.16.01...

Read more

《Redis 设计与实现》读书笔记(二) 链表


链表

​ 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。

​ 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为 Redis 使用的 C 语言并没有内置这种数据结构,所以 Redis 构建了自己的链表实现。

​ 链表在 Redis 中的应用非常广泛,比如列表键的底层实现之一就是链表:当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis 就会使用链表作为列表键的底层实现。

​ 举个例子,以下展示的 integers 列表键包含了从 11024 共一千零二十四个...

Read more

创建swapfile


Linux中的swap分区是一种虚拟内存,主要作用如下:

1、扩展内存容量:通过将不常用的内存数据移动到swap分区,可以为系统提供更多的可用内存空间。

2、提高系统性能:当物理内存不足时,系统可以使用swap分区作为额外的内存资源,从而提高系统的性能。

3、管理内存碎片:通过将不常用的内存数据移动到swap分区,可以避免物理内存中出现大量的内存碎片,从而提高内存的使用效率。

创建swap文件

#使用dd创建swap文件/data/swapfile,大小为1G
dd if=/dev/zero of=/data/swapfile bs=1M count=1024
#---或---
#使用f...

Read more