C++ 合并排序基本情况
我在练习排序算法,我被困在这个愚蠢的问题上 我特别不理解如何将数组划分为只包含单个(排序)元素的数组。我画了一个调用堆栈示例来说明我的困惑C++ 合并排序基本情况,c++,sorting,mergesort,C++,Sorting,Mergesort,我在练习排序算法,我被困在这个愚蠢的问题上 我特别不理解如何将数组划分为只包含单个(排序)元素的数组。我画了一个调用堆栈示例来说明我的困惑 void merge_sort(int A[], int start, int end) { if (start < end) { int mid = (start + end ) / 2; merge_sort(A, start, mid); merge_so
void merge_sort(int A[], int start, int end) {
if (start < end) {
int mid = (start + end ) / 2;
merge_sort(A, start, mid);
merge_sort(A, mid + 1, end);
merge(A, start, mid, end);
}
}
void merge_排序(int A[],int start,int end){
如果(开始<结束){
int mid=(开始+结束)/2;
合并排序(A、开始、中间);
合并排序(A,中间+1,结束);
合并(A、开始、中间、结束);
}
}
调用堆栈应该如下所示
合并排序(A,0,5)A[9,7,8,3,2,1]
合并排序(A,0,2)A[9,7,8]
合并排序(A,0,1)A[9,7]
merge_sort(A,0,0)->这里的基本情况将失败,不是吗
在这种情况下,数组将不会被划分为单例数组。对
merge\u sort(A,0,0)的递归调用
立即返回,因为left==right
即:具有单个元素的切片。当start==end表示只有一个元素要“排序”时,基本情况将返回原因start==end而不是start
由于start==end
也意味着start
将为false,因此函数将跳过if
主体内的所有内容
因此merge\u sort(A,0,0)
不做任何事情,而是将调用堆栈返回到merge\u sort(A,0,1)
查看merge\u排序(A,0,1)
调用,具体如下所示:
merge_sort(A, 0, 1)
merge_sort(A, 0, 0) // Does nothing
merge_sort(A, 1, 1) // Does nothing
merge(A, 0, 0, 1) // Merge the two partition 0-0 with 1-1
因此,一旦merge\u sort(A,0,0)
返回(不做任何操作),则调用merge\u sort(A,1,1)
,该函数除了返回外,什么也不做。Anmd然后用合并(A,0,0,1)
将两个子数组“合并”我不太明白,返回什么?没有执行其他函数get,即合并它们,因为它将使基本情况失败。然后我剩下的是一个[9,7],它不是一个单例数组。@Vocaloidas:merge\u-sort(A,0,1)
首先调用merge\u-sort(A,0,0)
,然后merge\u-sort(A,1,1)
,然后合并2个1元素子片,正如一些编程人员所解释的。好的,但在if块中,有merge函数。如果它start==end,那么startstart==end
时,只有一个元素需要排序。在merge\u sort(A,0,0)
的示例中,单个元素是A[0]
。如何进一步划分单个元素?不需要,但此时它应该开始调用merge函数来开始构建新的排序数组。如果合并函数在if块内,并且它不能进入if块,那么它就不能这样做。@因为我已经更新了答案。merge
调用发生在merge\u排序(A,0,1)
中,而不是在merge\u排序(A,0,0)
中。