【问题标题】:Trouble understanding merge sorts merge part of the algorithm麻烦理解归并排序合并部分算法
【发布时间】:2015-07-04 00:06:30
【问题描述】:

我在理解合并排序算法的“合并”部分时遇到了一点麻烦,因为我试图在上下文中理解算法的某些部分,而某些变量/循环对我。我了解递归划分过程和合并的排序方面,但在这个特定的合并算法中:

    public static void merge(int data[], int temp[], int low, int middle, int high){
    int ri=0; //result index
    int ti=low;//temp index
    int di=middle;//data index
    int[] result = new int[high-low+1];

    while (ti<middle && di<=high){
      if (data[di]<temp[ti]){
        result[ri++] = data[di++];//smaller is in data
       } 
       else{
            result[ri++] = temp[ti++];//smaller is in temp
            }
    } 

while(ti<middle) result[ri++]=temp[ti++];
while(di<=high) result[ri++]=data[di++];
for(int i=0;i<high;i++) data[low+i]=result[i];

我不明白最后 3 个循环:

while(ti<middle) result[ri++]=temp[ti++];
while(di<=high) result[ri++]=data[di++];
for(int i=0;i<high;i++) data[low+i]=result[i];

您能否解释一下这 3 个循环在合并上下文中的用途,以及任何进一步的建议以更好地理解合并排序算法的合并部分?

【问题讨论】:

    标签: java algorithm sorting merge


    【解决方案1】:

    这个循环while (ti&lt;middle &amp;&amp; di&lt;=high) 的条件意味着一旦在至少两半之一中没有更多元素时它就会终止。但是在另一个中仍然可以有一些元素。这就是我们需要这两行代码的原因:

    while(ti<middle) result[ri++]=temp[ti++]; // Remaining elements from the first half.
    while(di<=high) result[ri++]=data[di++]; // Remaining elements from the second half.
    

    现在我们需要将合​​并的结果复制到原始数组中。这正是最后一行所做的。

    关于对合并阶段的理解:你是否理解算法本身(在数学意义上,没有提到任何具体的编程语言)?如果你不这样做,那么首先尝试完全理解它而不看任何代码。如果您确实了解算法但不了解此代码,那很好,因为此代码非常糟糕。

    你可以看看更清晰的实现:

    mergeSort [] = []
    mergeSort [x] = [x]
    mergeSort xs = 
        let (firstHalf, secondHalf) = splitAt (length xs `div` 2) xs
        in merge (mergeSort firstHalf) (mergeSort secondHalf)  
    
    merge xs [] = xs
    merge [] ys = ys
    merge xs@(x:xt) ys@(y:yt) 
        | x <= y = x : merge xt ys
        | otherwise = y : merge xs yt
    

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2021-02-12
      • 2023-03-10
      相关资源
      最近更新 更多