zig与c3的冒泡排序算法
一、文章前言
那么好的上一片文章呢我们写了桶排序,其实老手都知道,当要排序的数值太大时,占用的数组越多,消耗的内存也就越大!
所以呢,大的数值就需要用到 -- 冒泡排序
二、介绍冒泡排序
一句话总结:像气泡往上冒一样,反复两两比较相邻数字,大的往后挪,一轮轮把最大的数 “浮” 到末尾,直到全部排好。
通俗解释
- 从头开始,挨着的两个数比大小
- 前面的数比后面大,就交换位置
- 一轮走完,最大的数会沉到最后
- 重复上面步骤,每次少比最后一个已排好的数
- 直到没有数需要交换,排序完成
小例子
原数列:3 1 5 2第一轮:1 和 3 换→3 和 5 不换→5 和 2 换 → 变成 1 3 2 5(5 归位)第二轮:1 和 3 不换→3 和 2 换 → 变成 1 2 3 5(3 归位)第三轮:无交换 → 完成
三、zig
一、前言
首先使用zig编程语言来写,zig呢在我使用的过程中,发现他的内存管理机制很严格,它规定数组内的数值必须是无符号整型 usize。在之前桶排序的时候,变量全是i32(有符号整型),所以就会一直用到关键词@intCast来强制转换,那这次学聪明了,直接使用u32来作为变量类型
//冒泡排序
const std = @import("std");
const print = @import("std").debug.print;
const c = @cImport({
@cInclude("stdio.h");
});
pub fn main() void {
var a: [100]u32 = undefined;
var n: u32 = 0;
var t: u32 = 0;
_ = c.scanf("%u", &n);
for (1..n + 1) |i| {
_ = c.scanf("%u", &a[i]);
}
for (0..n - 1) |i| {
for (1..n - i) |j| {
if (a[j] < a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for (1..n + 1) |i| {
print("{} ", .{a[i]});
}
}
//Zarek
输入
5
12 35 76 88 98
输出
98 88 76 35 12
二、总结
在这个代码中使用了嵌套循环的方式来实现排序,初学者肯定都对zig中for循环的机制搞得头大!包括我也是受害者之一,但在深度理解之后就明白起奥秘!
我们拿zig和C做对比
zig
for (0..n + 1) |i|
C语言
for(int i=0;i<=n;i++)
这两段是相同的意思,0..n就是循环0到n(不包含n),所以n+1就是让他包含n,后头的|i|是啥意思呢?它的意思就是让当前循环所到的值传给i,也就是i会从0走到n+1
%u应该大家也清楚,无符号整型
用的c.scanf();还是引用了C语言的头文件
四、C3
zig写完了就到C3了
一、前言
在C3中,90%的内容与C语言一样,虽然C3的库也叫做std和C语言的stdio好像没有差别太大,但是c3里面我好像没找到过能代替scanf输入的函数,所以这里也要引入C中的用法
在C3中我不确定是否可以直接引入stdio.h这个头文件,但是在我的测试中不太成立,只能通过引用需要的函数模块进行使用,这一点官网有写!可惜不多
import std;
extern fn int scanf(char*, ...);
fn void main()
{
int[100] a;
int i,j,t,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-1;j++)
{
if(a[j] < a[j+1])
{
t = a[j];
a[j]=a[j+1];
a[j+1] = t;
}
}
}
for(i=1;i<=n;i++)
{
io::printf("%d ",a[i]);
}
}
输入
5
12 35 76 88 98
输出
98 88 76 35 12
代码里的第二行,引用了C中的scanf来进行输入,唯一和C有区别的就是数组的定义和printf前面多加了io::。
三、总结
总的来说,这是我更新的第二章,老是要和zig、C3、C一起写,容易混套,这里面语法最复杂的就是zig,但是内存管理也很优秀
更多推荐



所有评论(0)