写出对关键字序(40,24,80,39,43,18,20,50,15)进行快速排序的每一趟结果,要求用递归法实现,语言使用c语言。
时间: 2024-12-09 10:17:57 浏览: 12
说文解字序资料与翻译.doc
快速排序是一种分而治之的排序算法,其基本思想是选择一个基准值,将数组分为两部分,一部分所有元素都小于基准,另一部分所有元素都大于等于基准,然后对这两部分分别进行排序。以下是递归实现快速排序的例子,以你给出的关键字序为例:
```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); // Index of smaller element
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++; // Move 'i' to next position
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 pi = partition(arr, low, high);
// 对左右两个子序列进行递归排序
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
// 主函数测试
int main() {
int arr[] = {40, 24, 80, 39, 43, 18, 20, 50, 15};
int n = sizeof(arr) / sizeof(arr[0]);
printf("原始序列: ");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
quickSort(arr, 0, n - 1);
printf("\n排序后的序列: ");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
```
这个程序首先会输出原始序列,然后通过递归调用`quickSort`函数进行排序,最终返回排序后的序列。由于这是递归过程,每一次调用都会得到一次排序的结果,但是为了展示每一趟排序的变化,你需要跟踪和打印递归过程中关键节点的数据变化。这里我没有提供每次递归调用的具体输出,因为那需要完整的递归树,但实际上你可以添加适当的日志打印,记录每次划分后的中间结果。
阅读全文