🔥 全网首发!Zig & C3 双语言实现快速排序

0 阅读5分钟

🔥 全网首发!Zig & C3 双语言实现快速排序(通俗易懂版)

连续更新第2天!🎉


一、前言

成功连续两天更新算法文章,太开心啦!

之前我们学到:

  • 桶排序 → 用内存换速度

  • 冒泡排序 → 用时间换简单

那有没有一个算法,既不浪费空间,又速度超快

当然有!它就是——快速排序(Quick Sort)

快速排序到底是什么?

一句话讲透:

找一个“基准数”,比它小的放左边,比它大的放右边,然后重复这个过程!


二、通俗原理:用排队讲明白

想象有 10 个人,要按身高从矮到高排队:

  1. 选基准:随便找一个人当“标准”

  2. 右边找:从右往左找,比基准矮的人停下

  3. 左边找:从左往右找,比基准高的人停下

  4. 交换位置:高的去右,矮的去左

  5. 碰头归位:两人相遇,把基准放到中间正确位置

  6. 递归重复:左边一堆、右边一堆,重复上面操作

数字直观演示

待排序:6 3 7 4 9 2

  1. 6 当基准

  2. 分堆后:2 3 4 6 9 7

  3. 左边 2 3 4 再排序

  4. 右边 9 7 再排序

  5. 最终结果:2 3 4 6 7 9


三、Zig 语言实现(完整可运行)

全球早期公开 Zig 快速排序实现,代码带详细注释!


// 导入Zig标准库
// Import Zig standard library
const std = @import("std");

// 引入打印函数
// Import print function for output
const print = @import("std").debug.print;

// 导入C语言标准库(用于scanf输入)
// Import C standard library (for scanf input)
const c = @cImport({
    @cInclude("stdio.h");
});

// 定义全局数组,存储待排序数据,长度101
// Define global array to store data to be sorted, length 101
var a: [101]u32 = undefined;

// 存储实际输入的数据个数
// Store the count of input data
var n: u32 = 0;

// 快速排序函数:left=左边界,right=右边界
// QuickSort function: left = left boundary, right = right boundary
pub fn QuickSort(left: u32, right: u32) void {
    // 定义循环变量、临时交换变量、基准数
    // Declare loop variables, swap temp, pivot value
    var i: u32 = 0;
    var j: u32 = 0;
    var t: u32 = 0;
    var temp: u32 = 0;

    // 递归终止条件:左边界超过右边界,直接返回
    // Recursion termination condition: return if left > right
    if (left > right) return;

    // 选取最左边的数作为基准数
    // Select the leftmost number as the pivot
    temp = a[left];
    i = left; // i从左向右扫描
    j = right; // j从右向左扫描

    // i和j未相遇时循环
    // Loop while i and j have not met
    while (i != j) {
        // 从右往左找:小于基准数的数
        // Search from right to left: find number < pivot
        while (a[j] >= temp and i < j) {
            j = j - 1;
        }

        // 从左往右找:大于基准数的数
        // Search from left to right: find number > pivot
        while (a[i] <= temp and i < j) {
            i = i + 1;
        }

        // i<j说明找到可交换的两个数
        // Swap if i<j (found valid pairs to swap)
        if (i < j) {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }

    // 基准数归位:将基准数放到正确位置
    // Place pivot to its correct position
    a[left] = a[i];
    a[i] = temp;

    // 递归排序基准数左侧
    // Recursively sort left part of pivot
    QuickSort(left, i - 1);

    // 递归排序基准数右侧
    // Recursively sort right part of pivot
    QuickSort(i + 1, right);
}

// 主函数:程序入口
// Main function: program entry point
pub fn main() void {
    // 输入数据个数n
    // Input the count of numbers: n
    _ = c.scanf("%d", &n);

    // 循环输入n个数字存入数组a
    // Loop to input n numbers into array a
    for (1..n + 1) |i| {
        _ = c.scanf("%d", &a[i]);
    }

    // 调用快速排序
    // Call quick sort function
    QuickSort(1, n);

    // 输出排序后的数组
    // Print sorted array
    for (1..n + 1) |i| {
        print("{}  ", .{a[i]});
    }

    // 暂停程序,防止窗口闪退
    // Pause program to prevent window from closing instantly
    _ = c.getchar();
    _ = c.getchar();
}

✨ 测试示例

输入:


10
6 1 2 7 9 3 4 5 10 8

输出:


1 2 3 4 5 6 7 8 9 10

说明:前面文章已经讲解过 Zig 基础用法,后续会精简讲解,代码多练自然熟练~


四、C3 语言实现(全网首发完整版)

全世界早期公开 C3 快速排序正确实现,语法简洁易懂!


// 导入C3标准库
// Import C3 standard library
import std;

// 声明外部C语言scanf输入函数
// Declare external C scanf input function
extern fn int scanf(char*, ...);

// 声明外部C语言getchar函数
// Declare external C getchar function
extern fn int getchar();

// 定义全局数组a,大小101
// Define global array a with size 101
int[101] a;

// 定义全局变量n,存储数据个数
// Define global variable n to store number count
int n = 0;

// 快速排序函数
// Quick Sort function
fn void quickSort(int left,int right)
{
 // 定义局部变量
 // Declare local variables
 int i = 0;
 int j = 0;
 int t = 0;
 int temp = 0;

 // 递归终止条件
 // Recursion termination condition
 if(left>right)return;

 // 设置基准数为左边界元素
 // Set pivot as the left boundary element
 temp = a[left];
 i = left;
 j = right;
 
 // 当i和j不相遇时循环
 // Loop while i and j have not met
 while(i != j)
 {
 // 从右向左找小于基准的数
 // Find element smaller than pivot from right to left
 while(a[j]>=temp && i<j)
 {
 j--;
 }

 // 从左向右找大于基准的数
 // Find element larger than pivot from left to right
 while(a[i]<=temp && i<j)
 {
 i++;
 }

 // 交换i和j位置的元素
 // Swap elements at i and j
 if(i<j)
 {
 t = a[i];
 a[i] = a[j];
 a[j] = t;
 }
 }

 // 基准数归位
 // Place pivot to correct position
 a[left] = a[i];
 a[i] = temp;

 // 递归排序左区间
 // Recursively sort left part
 quickSort(left,i-1);

 // 递归排序右区间
 // Recursively sort right part
 quickSort(i+1,right);
}

// 主函数:程序入口
// Main function: program entry point
fn void main()
{
 // 初始化数组全部为0
 // Initialize array to all 0s
 for(int i = 0;i<=100;i++)
 {
 a[i] = 0;
 }

 // 输入数据个数n
 // Input number count n
 scanf("%d",&n);

 // 输入n个数字到数组
 // Input n numbers into array
 for(int i = 1;i<=n;i++)
 {
 scanf("%d",&a[i]);
 }

 // 调用快速排序
 // Call quick sort
 quickSort(1,n);

 // 输出排序结果
 // Print sorted result
 for(int i = 1;i<=n;i++)
 {
 io::printf("%d ",a[i]);
 }

 // 暂停程序
 // Pause program
 getchar();
 getchar();
}

C3 语言一如既往简洁易上手,接近 C 语言,学习成本极低~


五、总结

我已经将 Zig + C3 双语言算法源码 全部开源上传 GitHub!

包含冒泡排序、快速排序等经典算法,持续更新中~

👉 项目地址zig和C3算法