这里是在merge merge中进行分区的代码。我无法理解recusrion究竟是如何工作的!
MERGE SORT PARTITION
void partition(int arr[], int low, int high){
int mid;
if(low < high){
mid = (low + high)/2;
partition(arr, low, mid);
partition(arr, mid + 1, high);
mergeSort(arr, low, mid, high);
}
}
实际上我在许多递归问题中搞砸了,并且无法理解系统堆栈在递归中是如何工作的...... 我是初学者..
答案 0 :(得分:2)
我会尝试让递归函数更简单。例如,一个阶乘伪代码的小例子:
int fact(n)
{
if(n==1 || n==0) return 1;
else
return (n*fact(n-1));
}
这样做会创建一堆函数。假设我调用fact(3)
这将形成如下堆栈:
fact(0)
fact(1)
fact(2)
fact(3)
其中每个函数都被推入堆栈。首先调用fact(3)
。 fact(3)
来电fact(2)
。通过后 -
堆积积累:
fact(0)
fact(1) fact(1)
fact(2) fact(2) fact(2)
empty --> fact(3) ---> fact(3) --> fact(3) --> fact(3)
现在该函数捕获n=0
并返回1
。现在函数开始弹出。
Stack:
fact(0) -----> (returns 1) = 1
fact(1) -----> (returns 1) * 1 (1's popped out)
fact(2) -----> (returns 2) * 1 (1 is actually 1*1)
fact(3) -----> (returns 3) * (2 = 2*1*1)
----->6
编辑:功能添加了pop。至于排序堆栈,请查看@ P0W的答案。
尝试一个小例子并构建你的堆栈。然后转向复杂的。记住练习是关键。这就是递归函数作为堆栈的工作方式。
希望它有所帮助。 :)
答案 1 :(得分:1)
让我们举一个
的例子数组arr ={ 5,2,4,7,1,3,2,6};
8个元素
1 2 3 4 5 6 7
^(partition+mergeSort)
|
+------------+ +---------------+
| |
2 4 5 7 1 2 3 6
^ (partition+mergeSort) ^ (partition+mergeSort)
| |
+--+ +---+ +--+ +---+
| | | |
2 5 4 7 1 3 2 6
^ (partition+mergeSort) ^ (partition+mergeSort)
| |
+---+ +---+ +---+ +---+
| | | |
5 2 4 7 1 3 2 6
4 elements 4 elements
Initial Unsorted Array
从下到上,用
形成两个数组 arr[low...mid]
和
<{1}}在每次递归调用时,最后它们都会合并。
分区&amp;只要arr[mid+1...high]
&lt;合并过程继续进行。 low
这只是high
如何在这里工作的一个例子,你可以按照这个例子的代码。
对此未排序数组的mergeSort
调用将具有:
第一次通过partition(arr, 0,7)
mid =3
使用
arr
和partion(arr,0,3)
每个分区再次分成两部分,即0到3分为partion(arr,4,7)
&amp; (0,1)
,再次(2,3)
和(0,1)
。 (1,1)
跳过(1,1)
,最后2个元素与low > high
合并
一组这样的小排序数组最终会合并起来,因为它会在后续传递中递归。
这里有点难以解释,在文本格式中,在纸上试试,我相信你可以弄明白,用更小的数组,比如4个元素。