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
.datadat dd 4,8,6,9,2,3,4,7,2,10cnt dd ?l dd ?r dd ?
.code
start:mov eax,10mov cnt,eaxcall scanf;初始化l,rmov eax,0mov l,eax;mov eax,9mov r,eax;调用快排call quicksortcall printexit
;封装交换函数
swap proc ;利用xchg 可以少用一个寄存器来充当临时变量mov edx,dat[esi*4];xchg edx,dat[ebx*4];xchg edx,dat[esi*4];ret
swap endpquicksort procmov eax,lcmp eax,rjg overxor esi,esi;xor ebx,ebx;mov esi,l;imov ebx,r;jmov 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_loopcmp eax,dat[ebx*4]; while (a[j]>=a[l])jg loop_i_againadd ebx ,-1 ; j--jmp loop_j_again; loop_i_again:cmp esi,ebx; while (i<j)jge over_loopcmp 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; breakcall swap; swap(i,j)jmp sort_againover_loop:mov ebx,l;call swap; swap(i,l)push esi; push ipush r ;push rmov r,esiadd r ,-1call quicksort; quicksort(l,i-1);pop rpop ebxmov l,ebx;inc lcall quicksort; quicksort(i+1,r);over:ret
quicksort endp;封装一个输出函数
print procmov ecx,cntxor esi,esi
print_again:mov eax,dat[esi*4]call writeintcall crlfinc esi;loop print_againret
print endp
;封装输入函数
scanf procmov ecx,cntxor esi,esi
scanf_again: call readintmov dat[esi*4],eaxinc esi;loop scanf_againret
scanf endp
end start
运行结果: