【汇编语言实战】对输入的数组实现快速排序

简介: 【汇编语言实战】对输入的数组实现快速排序

C语言描述:

#include <stdio.h>
// 交换数组中两个元素的位置
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
// 分区函数,将数组按照基准值划分为两部分
int partition(int arr[], int low, int high) {
    int pivot = arr[high]; // 选取数组最后一个元素作为基准值
    int i = low - 1; // 定义一个指针,初始指向第一个元素的前一个位置
    for (int j = low; j < high; j++) {
        if (arr[j] <= pivot) {
            i++; // 指针向后移动一位
            swap(&arr[i], &arr[j]); // 将小于等于基准值的元素交换到指针位置的左侧
        }
    }
    swap(&arr[i + 1], &arr[high]); // 将基准值交换到指针位置的右侧
    return i + 1; // 返回基准值的位置
}
// 快速排序函数
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pivotIndex = partition(arr, low, high); // 获取基准值的位置
        quickSort(arr, low, pivotIndex - 1); // 对基准值左侧的子数组进行快速排序
        quickSort(arr, pivotIndex + 1, high); // 对基准值右侧的子数组进行快速排序
    }
}
int main() {
    int arr[] = {4, 8, 6, 9, 2, 3, 4, 7, 2, 10};
    int n = sizeof(arr) / sizeof(arr[0]);
    // 输出原始数组
    printf("原始数组:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    // 调用快速排序函数
    quickSort(arr, 0, n - 1);
    // 输出排序后的数组
    printf("排序后的数组:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}


汇编语言:


INCLUDE irvine32.inc
.data
  dat dd 4,8,6,9,2,3,4,7,2,10
  cnt dd ?
  l dd ?
  r dd ?
.code
start:
  mov eax,10
  mov cnt,eax
  call scanf
  ;初始化l,r
  mov eax,0
  mov l,eax;
  mov eax,9
  mov r,eax
  ;调用快排
  call quicksort
  call print
  exit
;封装交换函数
swap proc 
  ;利用xchg 可以少用一个寄存器来充当临时变量
  mov edx,dat[esi*4];
  xchg edx,dat[ebx*4];
  xchg edx,dat[esi*4];
  ret
swap endp
quicksort proc
  mov eax,l
  cmp eax,r
  jg over
  xor esi,esi;
  xor ebx,ebx;
  mov esi,l;i
  mov ebx,r;j
  mov eax,dat[esi*4] 
  sort_again:
  cmp ebx,esi;    while (i!=j)
  je over_loop;
  loop_j_again:
    cmp esi,ebx;    while(i<j)
    jge over_loop
    cmp eax,dat[ebx*4];  while (a[j]>=a[l])
    jg loop_i_again
    add ebx ,-1   ;  j--
    jmp loop_j_again; 
  loop_i_again:
    cmp esi,ebx;    while (i<j)
    jge over_loop
    cmp eax,dat[esi*4];  while (a[l]>=a[i])
    jl compare;
    add esi,1;      i++
    jmp loop_i_again;
  compare:
    cmp esi,ebx;    if (i>=j)
    jge over_loop;    break
    call swap;    swap(i,j)
  jmp sort_again
  over_loop:
  mov ebx,l;
  call swap;    swap(i,l)
  push esi; push i
  push r  ;push r
  mov r,esi
  add r ,-1
  call quicksort;   quicksort(l,i-1);
  pop r
  pop ebx
  mov l,ebx;
  inc l
  call quicksort;   quicksort(i+1,r);
  over:
  ret
quicksort endp
;封装一个输出函数
print proc
  mov ecx,cnt
  xor esi,esi
print_again:
    mov eax,dat[esi*4]
    call writeint
    call crlf
    inc esi;
    loop print_again
  ret
print endp
;封装输入函数
scanf proc
  mov ecx,cnt
  xor esi,esi
scanf_again:  
    call readint
    mov dat[esi*4],eax
    inc esi;
    loop scanf_again
  ret
scanf endp
end start

运行结果:

目录
相关文章
|
8天前
|
C语言
【汇编语言实战】实现九九乘法表
【汇编语言实战】实现九九乘法表
16 2
|
8天前
|
C语言
【汇编语言实战】实现输出集合{1,2,...,n}全排列
【汇编语言实战】实现输出集合{1,2,...,n}全排列
12 1
|
8天前
|
C语言
【汇编语言实战】给定一个句子,将大写字母变为小写
【汇编语言实战】给定一个句子,将大写字母变为小写
12 1
|
8天前
|
C语言
【汇编语言实战】最小公倍数和最大公约数
【汇编语言实战】最小公倍数和最大公约数
22 1
|
8天前
|
C语言
【汇编语言实战】二分查找
【汇编语言实战】二分查找
12 1
|
8天前
|
C语言
【汇编语言实战】解迷宫问题
【汇编语言实战】解迷宫问题
15 2
|
8天前
|
算法 C语言 网络架构
【汇编语言实战】整数拆分问题
【汇编语言实战】整数拆分问题
17 2
|
8天前
|
C语言
【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用
【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用
10 1
|
8天前
|
C语言
【汇编语言实战】冒泡排序
【汇编语言实战】冒泡排序
17 1
【汇编语言实战】冒泡排序
|
8天前
|
C语言
【汇编语言实战】对给定的数组实现堆排序
【汇编语言实战】对给定的数组实现堆排序
10 1