输出快速排序递归算法隐含递归树的后序遍历序列
描述:
快速排序递归算法隐含一棵由关键字生成的二叉树(递归树),输出该隐含二叉树的后序遍历序列。(注:划分时以第一关键字为枢轴)
输入说明:
输入数据第一行为1个正整数n,表示关键字个数。第2行为n个整数表示n个关键字。
输出说明:
在一行上输出由关键字隐含的二叉树的后序遍历序列。
输入样例:
9
49 38 65 97 13 27 49 55 4
输出样例:
27 13 38 4 49 55 65 97 49
提示
在快速排序的过程中输出隐含二叉树的后序遍历序列,不用生成二叉树。
思路:
因为在快速排序的过程中存在递归,并且是分别快速排序枢轴量的左半部分和右半部分,这和二叉树分别建立左右子树是一样的,而其中的结点值也就是枢轴量。
大家可以看看我手写的这个大概过程。
还有一点就是大家可能会有顾虑,在遍历二叉树的时候,二叉树是已经建立好的,但是快速排序是一边在排序,一边在输出,这会不会使这个过程出现问题。
我觉得重点在int pivotloc = Partition(L, low, high);这个语句,这一句话实际上已经根据此次的枢轴量排序好了,那么也就相当于这棵树左右子树已经分好了,也就相当于二叉树是建立好的,然后下来再打印左子树的枢轴量,打印右子树,打印根。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void QSort(int L[100], int low, int high);
int Partition(int L[100], int low, int high);
int main()
{
int n;
int i;
int L[100] = { 0 };
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &L[i]);
QSort(L, 1, n);
return 0;
}
void QSort(int L[100], int low, int high)
{
//排序的时候可以是小于,因为最后一个数不用再处理,但是要输出,
//故尽管不处理,也一定要进入if条件判断,来打印这个值,也就是一定要low <= high
if (low <= high)
{
//这里的理解和二叉树的遍历思路是一样的,也就是先打印左边的枢轴量,
//再打印右边的枢轴量,最后打印根的值
int pivotloc = Partition(L, low, high);
QSort(L, low, pivotloc - 1);//可以理解为打印左边的枢轴量
QSort(L, pivotloc + 1, high);//打印右边的值
printf("%d ", L[pivotloc]);//打印根的值
}
}
int Partition(int L[100], int low, int high)
{
L[0] = L[low];
int pivotkey = L[low];
while (low < high)
{
while (low < high && L[high] >= pivotkey)
high--;
L[low] = L[high];
while (low < high && L[low] <= pivotkey)
low++;
L[high] = L[low];
}
L[low] = L[0];
return low;
}