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