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