mips程序设计——直接插入排序的递归与非递归实现(spim模拟)

非递归形式源码:

.data
array:.space 1024     #开辟数组空间
input_number_msg:.asciiz "Please input number of integers: "     
input_integer_msg:.asciiz "Please input integers to be sorted: " 
output_integer_msg:.asciiz "The sorted integers are: "           
  
.text
main:
    la $a0,input_number_msg     #提示输入待排序整数数目
    li $v0,4
    syscall
    li $v0,5                
    syscall
    la $t6,array
    move $t7,$zero     #初始化t7,用于循环计数
    move $t8,$v0     #t8用于存放待排序整数数目
input:
    la $a0,input_integer_msg     #提示输入待排序整数
    li $v0,4
    syscall

    li $v0,5
    syscall

    move $t0,$t7
    mul $t0,$t0,4
    addu $t1,$t0,$t6
    sw $v0,0($t1)

    addi $t7,$t7,1
    blt $t7,$t8,input     #输入待排序整数,直至达到t8中的给定数目
    
    move $t2,$zero     #t2用于插入排序的外层循环计数
insertion_sort:
    addi $t2,$t2,1     #i=i+1
    bge $t2,$t8,output #若循环次数达到给定整数数目,跳转至输出
    
    mul $t1,$t2,4
    addu $t1,$t1,$t6
    lw $t3,0($t1)     #t3=array[i]

    sub $t4,$t2,1
    mul $t4,$t4,4
    addu $t4,$t4,$t6
    lw $t4,0($t4)     #t4=array[i-1]     

    bge $t3,$t4,insertion_sort     #如果array[i]>=array[i-1],检查数组的下一个元素值
    move $t0,$t3                   #否则,将t3的值设为key,存入t0
    sw $t4,0($t1)     #array[i]=array[i-1]

    sub $t3,$t2,2     #j=i-2
inner_loop:
    mul $t4,$t3,4
    addu $t4,$t4,$t6
    lw $t4,0($t4)     #t4=array[j]
    bge $t0,$t4,backspace     #如果key>=array[j],array[j+1]=key
    addi $t5,$t3,1            #否则,array[j+1]=array[j]    
    mul $t5,$t5,4
    addu $t5,$t5,$t6
    sw $t4,0($t5)
     
    sub $t3,$t3,1            #j=j-1
    beq $t3,-1,backspace     #如果j==-1,array[j+1]=key
    b inner_loop
backspace:
    addi $t3,$t3,1
    mul $t3,$t3,4
    addu $t3,$t3,$t6
    sw $t0,0($t3)     #array[j+1]=key
    blt $t2,$t8,insertion_sort     #如果i<t8,检查下一个元素值        
output:
    la $a0,output_integer_msg     #输出排序后的整数
    li $v0,4
    syscall
    move $t7,$zero  
print_loop:
    move $t0,$t7
    mul $t0,$t0,4
    addu $t1,$t0,$t6
    lw $a0,0($t1)
    li $v0,1
    syscall
    addi $t7,$t7,1
    blt $t7,$t8,print_loop

    jr $ra
    


递归形式源码:

.data
array:.space 1024     #开辟数组空间
input_number_msg:.asciiz "Please input number of integers: "
input_integer_msg:.asciiz "Please input integers to be sorted: "
output_integer_msg:.asciiz "The sorted integers are: "  
  
.text
##主函数,调用插入排序函数和输出函数
main:
    subu $sp,$sp,4
    sw $ra,0($sp)     #main的返回地址入栈
    la $a0,input_number_msg     #提示输入待排序整数数目
    li $v0,4
    syscall
    li $v0,5
    syscall
    la $t6,array
    move $t7,$zero     #初始化t7,用于循环计数
    move $t8,$v0     #t8用于存放待排序整数数目
input:
    la $a0,input_integer_msg     #提示输入待排序整数
    li $v0,4
    syscall

    li $v0,5
    syscall

    move $t0,$t7
    mul $t0,$t0,4
    addu $t1,$t0,$t6
    sw $v0,0($t1)

    addi $t7,$t7,1
    blt $t7,$t8,input     #输入待排序整数,直至达到t8中的给定数目

    move $a0,$t8     #整数的数目n作为函数参数存入a0

    jal insertion_sort     #调用插入排序函数
    jal output     #调用输出函数

    lw $ra,0($sp)     #main的返回地址出栈
    addi $sp,$sp,4
    jr $ra

##插入排序函数insertion_sort(n)
insertion_sort:
    subu $sp,$sp,32     #保存现场
    sw $ra,28($sp)
    sw $fp,24($sp)
    sw $s0,20($sp)
    addi $fp,$sp,32
    
    move $s0,$a0     #s0=n-1
    blt $s0,1,sort_ret     #如果s0<1,递归结束

    sub $a0,$s0,1     #a0=s0-1
    jal insertion_sort     #insertion_sort(n-1)

    beq $s0,$t8,sort_ret     #如果s0==t8,函数终止
    mul $t1,$s0,4
    addu $t1,$t1,$t6
    lw $t3,0($t1)     #t3=array[n]

    sub $t4,$s0,1
    mul $t4,$t4,4
    addu $t4,$t4,$t6
    lw $t4,0($t4)     #t4=array[n-1]

    bge $t3,$t4,sort_ret     #如果array[n]>=array[n-1],继续递归
    move $t0,$t3             #否则,将t3的值设为key,存入t0
    sw $t4,0($t1)     #array[i]=array[i-1]

    sub $t3,$s0,2     #j=n-2
    beq $t3,-1,backspace     #如果j==-1,array[j+1]=key
inner_loop:
    mul $t4,$t3,4
    addu $t4,$t4,$t6
    lw $t4,0($t4)     #t4=array[j]
    bge $t0,$t4,backspace     #如果key>=array[j],array[j+1]=key
    addi $t5,$t3,1            #否则,array[j+1]=array[j]
    mul $t5,$t5,4
    addu $t5,$t5,$t6
    sw $t4,0($t5)

    sub $t3,$t3,1            #j=j-1
    beq $t3,-1,backspace     #如果j==-1,array[j+1]=key
    b inner_loop
backspace:
    addi $t3,$t3,1
    mul $t3,$t3,4
    addu $t3,$t3,$t6
    sw $t0,0($t3)     #array[j+1]=key
sort_ret:
    lw $ra,28($sp)     #恢复现场
    lw $fp,24($sp)
    lw $s0,20($sp)
    addi $sp,$sp,32
    jr $ra

##输出排序后的整数    
output:
    subu $sp,$sp,32     #保存现场
    sw $ra,28($sp)
    sw $fp,24($sp)
    sw $t0,20($sp)
    sw $t1,16($sp)
    sw $t6,12($sp)
    sw $t7,8($sp)
    addi $fp,$sp,32

    la $a0,output_integer_msg
    li $v0,4
    syscall
    move $t7,$zero  
print_loop:
    move $t0,$t7
    mul $t0,$t0,4
    addu $t1,$t0,$t6
    lw $a0,0($t1)
    li $v0,1
    syscall
    addi $t7,$t7,1
    blt $t7,$t8,print_loop
    
    lw $ra,28($sp)     #恢复现场
    lw $fp,24($sp)
    lw $t0,20($sp)
    lw $t1,16($sp)
    lw $t6,12($sp)
    lw $t7,8($sp)
    addi $sp,$sp,32
    jr $ra

初次写mips程序,效率方面可能不理想。后面有时间会改进。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值