【发布时间】:2016-03-19 01:56:21
【问题描述】:
下面的函数是快速排序的一个实现。在这里,我们将最后一个元素作为枢轴。
我理解partition 函数(枢轴到达其排序位置的位置),但我无法理解递归函数qs。函数qs 递归调用自身,以qs(a,start,pi-1) 求解左侧,qs(a,pi+1,end) 求解右侧。
它是先求解左边,然后是(左边),然后是(左边),等等,然后是左,左...右,等等。还是交替先解决左边,再解决右边。
PS:我想知道计算机内部发生了什么,这种快速排序的递归机制。该程序正在运行,但我想知道它是如何工作的。
int partition(int *a, int start, int end)
{
int pivot=a[end];
int pi=start;
for(int i=start; i<end; i++)
{
if(a[i]<=pivot)
{
swap(a[i],a[pi]);
pi++;
}
}
swap(a[pi], a[end]);
return pi;
}
void qs(int*a, int start, int end)
{
if(start<end)
{
int pi=partition(a,start,end);
qs(a,start,pi-1);
qs(a,pi+1,end);
}
}
【问题讨论】:
-
第一个(左,左,左,左,...右)。对
qs的第一次递归调用位于数组的左分区。在第一次调用返回之前,不会对数组的右分区进行递归调用,即直到左分区完全排序。另一种看待这个问题的方式是,您正在执行递归树的深度优先遍历。 -
@beaker 在第一个分区之后,左边又再次向左分区,但是左侧分区的右侧(左侧的第二个分区,它的右侧)呢?
-
@beaker 另外,左侧(第一个分区)排序后,在对右侧qs(a,pi+1,end)进行排序时,左侧函数qs不会(a,start,pi-1) 也被调用?那么右侧(第一个分区)不会按与左侧不同的进程排序吗?
-
你应该阅读子程序,即函数调用和结果call stack structure
标签: algorithm sorting recursion quicksort divide-and-conquer