🔥 全网首发!Zig & C3 双语言实现快速排序(通俗易懂版)
连续更新第2天!🎉
一、前言
成功连续两天更新算法文章,太开心啦!
之前我们学到:
-
桶排序 → 用内存换速度
-
冒泡排序 → 用时间换简单
那有没有一个算法,既不浪费空间,又速度超快?
当然有!它就是——快速排序(Quick Sort)!
快速排序到底是什么?
一句话讲透:
找一个“基准数”,比它小的放左边,比它大的放右边,然后重复这个过程!
二、通俗原理:用排队讲明白
想象有 10 个人,要按身高从矮到高排队:
-
选基准:随便找一个人当“标准”
-
右边找:从右往左找,比基准矮的人停下
-
左边找:从左往右找,比基准高的人停下
-
交换位置:高的去右,矮的去左
-
碰头归位:两人相遇,把基准放到中间正确位置
-
递归重复:左边一堆、右边一堆,重复上面操作
数字直观演示
待排序:6 3 7 4 9 2
-
选 6 当基准
-
分堆后:
2 3 4 6 9 7 -
左边
2 3 4再排序 -
右边
9 7再排序 -
最终结果:
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算法