【汇编语言实战】使用插入排序对给定的数组排序(用栈传递参数)

简介: 【汇编语言实战】使用插入排序对给定的数组排序(用栈传递参数)

C语言描述:


#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100
// 定义栈结构
typedef struct {
    int items[MAX_SIZE];
    int top;
} Stack;
// 初始化栈
void initStack(Stack *stack) {
    stack->top = -1;
}
// 判断栈是否为空
bool isEmpty(Stack *stack) {
    return stack->top == -1;
}
// 判断栈是否已满
bool isFull(Stack *stack) {
    return stack->top == MAX_SIZE - 1;
}
// 入栈操作
void push(Stack *stack, int value) {
    if (isFull(stack)) {
        printf("栈已满,无法入栈\n");
        return;
    }
    stack->items[++stack->top] = value;
}
// 出栈操作
int pop(Stack *stack) {
    if (isEmpty(stack)) {
        printf("栈为空,无法出栈\n");
        return -1;
    }
    return stack->items[stack->top--];
}
// 插入排序函数,使用栈作为参数
void insertionSortWithStack(Stack *stack) {
    Stack tempStack;
    initStack(&tempStack);
    // 将栈中的元素依次出栈,并按顺序插入到临时栈中
    while (!isEmpty(stack)) {
        int temp = pop(stack);
        // 将栈中所有大于temp的元素出栈,暂存到tempStack中
        while (!isEmpty(&tempStack) && tempStack.items[tempStack.top] > temp) {
            push(stack, pop(&tempStack));
        }
        // 将temp插入到正确的位置
        push(&tempStack, temp);
    }
    // 将临时栈中的元素依次出栈,重新入栈到原始栈中,实现排序
    while (!isEmpty(&tempStack)) {
        push(stack, pop(&tempStack));
    }
}
int main() {
    int arr[] = {5, 2, 8, 1, 6};
    int n = sizeof(arr) / sizeof(arr[0]);
    int i;
    // 将数组元素依次入栈
    Stack stack;
    initStack(&stack);
    for (i = 0; i < n; i++) {
        push(&stack, arr[i]);
    }
    // 调用插入排序函数对栈中元素进行排序
    insertionSortWithStack(&stack);
    // 输出排序后的数组
    printf("排序后的数组:\n");
    while (!isEmpty(&stack)) {
        printf("%d ", pop(&stack));
    }
    printf("\n");
    return 0;
}


汇编语言:


include irvine32.inc
.data
array dword 5, 2, 8, 1, 6   ; 待排序的数组
array_end equ $              ; 数组结束地址
msg db "Sorted array: ", 0
.code
main proc
    mov esi, offset array    ; 初始化数组指针
outer_loop:
    cmp esi, offset array_end    ; 比较当前位置和数组结束地址
    jge end_sort                ; 如果当前位置 >= 结束地址,跳转到结束排序
    push esi                    ; 将当前位置压栈作为参数
    call insertSort             ; 调用插入排序函数
    add esp, 4                  ; 清空栈
    add esi, 4                  ; 指针移动到下一个元素
    jmp outer_loop              ; 继续外层循环
end_sort:
    call crlf
    mov esi, offset array       ; 初始化数组指针
    mov edx, offset msg
    call writestring
print_array:
    mov eax, [esi]              ; 取出数组元素
    call writeint               ; 输出数组元素到屏幕
    call crlf
    add esi, 4                  ; 指针移动到下一个元素
    cmp esi, offset array_end    ; 比较当前位置和数组结束地址
    jl print_array              ; 若当前位置小于结束地址,则继续输出
    exit
main endp
insertSort proc
    push ebp
    mov ebp, esp
    mov eax, [ebp+8]            ; 参数指针
    mov ebx, [eax]              ; 取出当前元素
    mov ecx, eax                ; 初始化内层循环指针
inner_loop:
    cmp ecx, offset array       ; 比较指针和数组起始地址
    jle update_array           ; 如果指针 <= 数组起始地址,跳转到更新数组
    mov edx, [ecx-4]            ; 取出前一个元素
    cmp ebx, edx                ; 比较当前元素和前一个元素
    jge update_array           ; 如果当前元素 >= 前一个元素,跳转到更新数组
    ; 交换当前元素和前一个元素
    mov [ecx], edx
    sub ecx, 4                  ; 指针前移
    jmp inner_loop              ; 继续内层循环
update_array:
    mov [ecx], ebx              ; 更新数组中的元素
    pop ebp
    ret
insertSort endp
end main



运行结果:

目录
相关文章
|
1月前
|
C语言
【汇编语言实战】实现九九乘法表
【汇编语言实战】实现九九乘法表
24 2
|
1月前
|
C语言
【汇编语言实战】输入一个无符号整数求其逆序
【汇编语言实战】输入一个无符号整数求其逆序
22 2
|
1月前
|
C语言
【汇编语言实战】实现输出集合{1,2,...,n}全排列
【汇编语言实战】实现输出集合{1,2,...,n}全排列
21 1
|
1月前
|
C语言
【汇编语言实战】给定一个句子,将大写字母变为小写
【汇编语言实战】给定一个句子,将大写字母变为小写
29 1
|
1月前
|
C语言
【汇编语言实战】最小公倍数和最大公约数
【汇编语言实战】最小公倍数和最大公约数
43 1
|
1月前
|
C语言
【汇编语言实战】二分查找
【汇编语言实战】二分查找
17 1
|
1月前
|
C语言
【汇编语言实战】正整数的素数分解
【汇编语言实战】正整数的素数分解
26 1
|
1月前
|
C语言
【汇编语言实战】冒泡排序
【汇编语言实战】冒泡排序
25 1
【汇编语言实战】冒泡排序
|
1月前
|
C语言
【汇编语言实战】解迷宫问题
【汇编语言实战】解迷宫问题
22 2
|
1月前
|
算法 C语言 网络架构
【汇编语言实战】整数拆分问题
【汇编语言实战】整数拆分问题
22 2