冒泡排序(Bubble_Sort)

冒泡排序是一种基础排序算法,通过相邻元素间的比较和交换实现排序。本文介绍了冒泡排序的工作原理,并讨论了一种优化策略,即通过标志位change来判断序列是否已有序,以减少不必要的比较。
摘要由CSDN通过智能技术生成

冒泡排序算法是一个耳熟能详的算法,在我们学习计算机的专业课的时候,在课本中经常会见到该程序,作为一个非常简单的例子程序。如果你不能默写该算法,那么你就没学过计算机的相关课程。好了,不说闲话了。

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。

//冒泡排序(小数上升,大数下沉)
#include<stdio.h>
typedef int Status;
#define TRUE 1
#define FALSE 0
//将a中整数序列重新排列成自小到大的有序的整数序列
void bubble_sort(int a[],int n)
{
	int i,j,t;
	<span style="color:#ff0000;">Status change;
</span>	for(i=n-1,change=TRUE;i>=1 && change;--i)//外循环
	{
		<span style="color:#ff0000;">change=FALSE;//设置change的作用是,当该序列提前有序的时候,就不用再往下进行比较了,该序列已经是有序的了
</span>		for(j=0;j<i;j++)//内层循环
		{
			if(a[j] > a[j+1]) /
下面是RISC-V汇编代码实现冒泡排序的函数bubble_sort: ``` .section .text .globl bubble_sort bubble_sort: addi sp, sp, -16 # 为函数保存栈空间 sw ra, 0(sp) # 保存ra寄存器到栈中 sw s0, 4(sp) # 保存s0寄存器到栈中 sw s1, 8(sp) # 保存s1寄存器到栈中 mv s0, a0 # 将第一个参数arr保存到s0寄存器中 mv s1, a1 # 将第二个参数len保存到s1寄存器中 li t0, 1 # 初始化标志变量flag为1 li t1, 0 # 初始化i为0 outer_loop: beqz t0, done # 如果本轮没有发生交换,说明已经排好序,跳到结束 li t0, 0 # 将标志变量flag初始化为0 li t2, 0 # 初始化j为0 inner_loop: bge t1, s1, outer_loop # 如果i >= len,退出内循环 lw t3, 0(s0) # 将arr[i]保存到t3寄存器中 addi t4, s0, 8 # 将arr[j+1]的地址保存到t4寄存器中 bge t2, s1, break_loop # 如果j >= len-1,退出内循环 lw t5, 0(t4) # 将arr[j+1]保存到t5寄存器中 blt t3, t5, no_swap # 如果arr[i] < arr[j+1],不进行交换 sw t5, 0(s0) # 将arr[j+1]保存到arr[i]中 sw t3, 0(t4) # 将arr[i]保存到arr[j+1]中 li t0, 1 # 标志变量flag设置为1,表示本轮发生了交换 no_swap: addi t2, t2, 1 # j++ addi s0, s0, 8 # arr++ j inner_loop break_loop: addi t1, t1, 1 # i++ li t2, 0 # 将j重置为0 mv s0, a0 # 将arr重新指向数组头部 j outer_loop done: lw ra, 0(sp) # 从栈中恢复ra寄存器 lw s0, 4(sp) # 从栈中恢复s0寄存器 lw s1, 8(sp) # 从栈中恢复s1寄存器 addi sp, sp, 16 # 恢复栈指针 ret # 返回 ``` 该函数使用了两层循环,外层循环控制排序的轮数,内层循环控制每轮中的比较和交换。由于传入的数组是以指针形式传递的,所以在实现中需要使用lw和sw指令来读取和写入数组元素的值。为了提高效率,我们使用寄存器来保存一些变量,如标志变量flag、循环变量i、j和数组指针arr。同时,为了保存寄存器的值,在函数的开头使用了addi指令将栈指针sp向下移动,然后将需要保存的寄存器的值保存到栈中,在函数结尾处再将这些值恢复回来,最后使用ret指令返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值