Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 合并排序基本情况_C++_Sorting_Mergesort - Fatal编程技术网

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)
中。