【问题标题】:Merge sort - four sorted parts in one array合并排序 - 一个数组中的四个排序部分
【发布时间】:2016-03-12 13:06:15
【问题描述】:

我有一个数组,其中有 4 个已排序的部分。例如

int array[20] = {1,4,7,8,10,2,3,6,8,11,1,2,7,8,9,3,4,9,10,13}

我需要做的是对前 2 个排序部分(1,4,7,8,10 和 2,3,6,8,11)使用合并排序,然后对后 2 个排序部分(1,2, 7,8,9 和 3,4,9,10,13)。然后我需要将这 2 个排序部分合并到一个排序数组中。

我尝试使用这些代码,但出现了问题。

void Merge(int *array, int *aux, int left, int right)
{
    int middleIndex = (left + right) / 2;
    int leftIndex = left;
    int rightIndex = middleIndex + 1;
    int auxIndex = left;
    while (leftIndex <= middleIndex && rightIndex <= right)
    {
        if (array[leftIndex] >= array[rightIndex])
        {
            aux[auxIndex] = array[leftIndex++];
        }
        else
        {
            aux[auxIndex] = array[rightIndex++];
        }
        auxIndex++;
    }
    while (leftIndex <= middleIndex)
    {
        aux[auxIndex] = array[leftIndex++];
        auxIndex++;
    }
    while (rightIndex <= right)
    {
        aux[auxIndex] = array[rightIndex++];
        auxIndex++;
    }
}

知道如何修改它,或者写得更好吗?谢谢

【问题讨论】:

  • “但是出了点问题” - 如果您不告诉我们什么出了问题,我们将无法帮助您...
  • 如何调用合并?您有四个范围,您可以一次合并其中两个,而不是四个。
  • 通常只写一个归并排序算法(初始顺序无关紧要),但您是否尝试为这种特定情况编写算法?此外,你没有显示你如何调用你的函数。
  • 尝试使用left = 0,right = 10 =第二个索引调用此代码。然后将leftIndex &lt;= middleIndex &amp;&amp; rightIndex &lt;= right 替换为leftIndex &lt; middleIndex &amp;&amp; rightIndex &lt; right。那么输出是什么?
  • 你知道排序范围的开始和结束的索引在哪里吗?如果是这样,那么使用std::inplace_merge

标签: c++ sorting mergesort


【解决方案1】:
        import java.util.Arrays;

        public class Main {

            public static void main(String[] args) {

                int[]  sortArr1 =  merge(new int[] {1 , 4 , 7 , 8 , 10} , new int[] {2 , 3 , 6 , 8 , 11} );
                System.out.println("Merging of sorted array  " +Arrays.toString(sortArr1));

                int[]  sortArr2 =  merge(new int[] {1 , 2 , 7 , 8 , 9} , new int[] {3 , 4 , 9 , 10 , 13} );
                System.out.println("Merging of sorted array  " +Arrays.toString(sortArr2));

                int[]  finalSort = merge(sortArr1 , sortArr2);
                System.out.println("Merging of sorted array  " +Arrays.toString(finalSort));

            }

            public static int[] merge(int[] arr1 , int[] arr2) {

                int[] sort = new int[arr1.length + arr2.length];         
                int j = 0;
                int k = 0;

                for(int i = 0 ; i < sort.length ; i++ ) {
                    if(j <= (arr1.length - 1)  && k <= (arr2.length - 1)) {
                        if(arr1[j] > arr2[k]) {
                            sort[i] = arr2[k++];
                        }else {
                            sort[i] = arr1[j++];
                        }
                    }else if(j <= (arr1.length - 1)) {
                        sort[i] = arr1[j++];
                    }else if(k <= (arr2.length - 1)){
                        sort[i] = arr2[k++];
                    }
                }

                return sort;
            }

        }

程序的输出是:

       Merging of sorted array  [1, 2, 3, 4, 6, 7, 8, 8, 10, 11]
       Merging of sorted array  [1, 2, 3, 4, 7, 8, 9, 9, 10, 13]
       Merging of sorted array  [1, 1, 2, 2, 3, 3, 4, 4, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 13]

【讨论】:

    【解决方案2】:

    知道如何修改它,或者写得更好吗?谢谢

    由于范围已经排序,并且您知道范围的开始和结束位置,请使用std::inplace_merge

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    
    int array[20] = {1,4,7,8,10,2,3,6,8,11,1,2,7,8,9,3,4,9,10,13};
    
    using namespace std;
    
    void MergeSort(int *arr, int start1, int start2, int start3, 
                   int start4, int size)
    {
       std::inplace_merge(arr + start1, arr + start2, arr + start3);
       std::inplace_merge(arr + start3, arr + start4, arr + size);
       std::inplace_merge(array, array + start3, arr + size);
    }
    
    int main()
    {
       MergeSort(array, 0, 5, 10, 15, 20);
       std::copy(array, array + 20, ostream_iterator<int>(cout, " "));
    }
    

    Live Example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多