MIPS—冒泡排序
SORT
使用冒泡排序对整数数组进行排序,这种排序虽然不是最快的,但却是最简单的。
C语言代码
#include<stdio.h>
#include<iostream>
using namespace std; void swap(int v[], int k)
{
int tmp;
tmp = v[k];
v[k] = v[k + ];
v[k + ] = tmp;
} void sort(int v[], int n)
{
int i, j;
for (i = ; i < n; i += )
for (j = i - ; j >= && v[j] > v[j + ]; j -= )
swap(v, j);
} int arr[] = { ,,,,,, }; int main()
{
sort(arr, );
for (int i = ; i < ; i++)
printf("%d ", arr[i]);
return ;
}
MIPS代码
#sort
.data
array: .word ,,,,,,
str_old: .asciiz "old array:\n"
str_new: .asciiz "new array:\n"
blank: .asciiz " "
enter: .asciiz "\n"
.text
.globl main
main:
la $a0,str_old
li $v0,
syscall #print str_old string
jal print_array #print old arrry la $a0,array #array name
li $a1, #array length
jal sort la $a0,str_new
li $v0,
syscall #print str_new string
jal print_array #print new arrry li $v0,
syscall # exit print_array:
li $a1,
la $a2, array
loop1: blez $a1, over1
lw $a0, ($a2)
li $v0,
syscall la $a0, blank
li $v0,
syscall addi $a2, $a2,
addi $a1, $a1, -
j loop1
over1:
la $a0, enter
li $v0,
syscall
jr $ra #$a0: arrry
#$a1: k
swap:
sll $t1,$a1, #reg $t1 = k *
add $t1,$a0,$t1 #reg $t1 = v + k * lw $t0,($t1) #reg $t0(tmp) = v[k]
lw $t2,($t1) #reg $t2 = v[k + ] sw $t2,($t1) #v[k] = v[k + ]
sw $t0,($t1) #v[k+ ] = tmp(v[k])
jr $ra
#$a0: v
#$a1: n
#$s0: i
#$s1: j
sort:
addi $sp,$sp,- #make room on stack for registers
sw $ra,($sp)
sw $s3,($sp)
sw $s2,($sp)
sw $s1,($sp)
sw $s0,($sp) move $s2,$a0 #save v
move $s3,$a1 #save n move $s0,$zero #i =
for1tst:
slt $t0,$s0,$s3 #if(i < n),reg $t0 = 1
beq $t0,$zero,exit1 addi $s1,$s0,-
for2tst:
slti $t0,$s1, #if(j < 0),reg $t0 = 1
bnez $t0,exit2 #go to exit2 if(j < )
sll $t1,$s1, #$t1 = j *
add $t2,$s2,$t1 #$t2 = v + j *
lw $t3,($t2) #$t3 = v[j]
lw $t4,($t2) #$t4 = v[j + ]
slt $t0,$t4,$t3 #if(v[j + 1] < v[j]),reg $t0 = 1
beq $t0,$zero,exit2 #go to exit2 if(v[j + ] >= v[j]) move $a0,$s2 #first parameter is v
move $a1,$s1 #second parameter is j
jal swap addi $s1,$s1,- #j--
j for2tst #continue inner loop
exit2:
addi $s0,$s0,
j for1tst
exit1:
lw $s0,($sp)
lw $s1,($sp)
lw $s2,($sp)
lw $s3,($sp)
lw $ra,($sp)
addi $sp,$sp,
jr $ra
参考链接:wang22ti.com/2018/04/20/《计算机体系结构》实验2-1-MIPS指令集编程之冒泡排序/
MIPS—冒泡排序的更多相关文章
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- Html5 冒泡排序演示
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要 ...
- javascript冒泡排序
数组冒泡排序算法(升序) 升序:小数在前,大数在后 冒泡排序的原则:每次比较相邻两个元素,如果前一个数>后一个数,说明违反升序的要求,就将两数交换位置.否则,保持不变.继续比较下一对. 例如:玩 ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- C#冒泡排序算法
用了两种形式的数据,一个是泛型List,一个是数据int[].记录一下,作为自己学习过程中的笔记. using System; using System.Collections.Generic; us ...
- python排序之二冒泡排序法
python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...
- 以冒泡排序为例--malloc/free 重定向stdin stdout
esort.c 代码如下,可关注下mallloc/free,freopen重定向的用法,排序为每轮将最小的数放在最前面: #include<stdio.h> #include<mal ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
随机推荐
- Flutter实战视频-移动电商-11.首页_屏幕适配方案讲解
11.首页_屏幕适配方案讲解 国人写的屏幕适配插件: https://github.com/OpenFlutter/flutter_screenutil 最新版本是0.5.1 在pubspec.yam ...
- E20190225-hm
seal n. 密封; 印章; 海豹; 封条; v. 密封; 盖章; 决定; 封上(信封); primitive adj. 原始的; 发展水平低的; 落后的; [生物学] 原生的; n. 原始 ...
- 201621123016 《Java程序设计》第八周学习总结
1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 ArrayList在调用contains方法时会调用indexOf方法得到 ...
- POJ 3067【树状数组】
题意: 给你两行数字,n个m个,然后给你k条线直接把两个数连起来,问有多少个交叉的 思路: 假定上一行是起点,下一行是终点. 把路按照起点从大到下排序, 然后可以直接对每条路查询,这条路目前的交叉数, ...
- CentOS Linux 7 提示 lsof: 未找到命令
我们常使用 lsof -i:端口号 命令来查看某端口是否开放,如使用下面的命令,查看8080端口: lsof -i: 结果: 提示:lsof:未找到命令 解决办法 使用yum来安装lsof,命令如下: ...
- python 如何在 command 中能够找到 其他module
部分代码如下: __author__ = 'norsd' # coding=utf8 # 上句说明使用utf8编码 try: import os import sys import time #关键语 ...
- C 语言实例 - 计算字符串长度
C 语言实例 - 计算字符串长度 C 语言实例 C 语言实例 计算字符串长度. 实例 - 使用 strlen() #include <stdio.h> #include <strin ...
- C 语言实例 - 两个矩阵相加
C 语言实例 - 两个矩阵相加 C 语言实例 C 语言实例 使用多维数组将两个矩阵相加. 实例 #include <stdio.h> int main(){ ][], b[][], sum ...
- Java 分析工具汇总
http://blog.csdn.net/fenglibing/article/details/6411999 jps jps -mlvV jmap jmap -heap <pid> ...
- 存储-InfluxDB
1 TSDB influxDB是一个time series时间序列数据库. 在监控系统的开发中,大体分为采集-存储-可视化三个大类.监控指标有很显著的时间特征数据,一般采用TSDB存储. 在TSDB中 ...