一、文章前言

那么好的上一片文章呢我们写了桶排序,其实老手都知道,当要排序的数值太大时,占用的数组越多,消耗的内存也就越大!

所以呢,大的数值就需要用到 -- 冒泡排序

二、介绍冒泡排序

一句话总结:像气泡往上冒一样,反复两两比较相邻数字,大的往后挪,一轮轮把最大的数 “浮” 到末尾,直到全部排好。

通俗解释

  1. 从头开始,挨着的两个数比大小
  2. 前面的数比后面大,就交换位置
  3. 一轮走完,最大的数会沉到最后
  4. 重复上面步骤,每次少比最后一个已排好的数
  5. 直到没有数需要交换,排序完成

小例子

原数列: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,但是内存管理也很优秀

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐