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
运行结果: