C++ 如何找到低收入者;高级合并排序

C++ 如何找到低收入者;高级合并排序,c++,algorithm,mergesort,C++,Algorithm,Mergesort,我对合并排序算法有基本的了解。但由于某些原因,我无法理解低值和高值的来源。这是我正在处理的用于合并的代码 void practiceMerge(int a[], int low, int mid, int high) { int b[10000]; int i = low, j = mid + 1, k = 0; while (i <= mid && j <= high) { if (a[i] <= a[j])

我对合并排序算法有基本的了解。但由于某些原因,我无法理解低值和高值的来源。这是我正在处理的用于合并的代码

void practiceMerge(int a[], int low, int mid, int high)
{
    int b[10000];
    int i = low, j = mid + 1, k = 0;

    while (i <= mid && j <= high) {
        if (a[i] <= a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++];
    }
    while (i <= mid)
    b[k++] = a[i++];

    while (j <= high)
        b[k++] = a[j++];

    k--;
    while (k >= 0) {
        a[low + k] = b[k];
        k--;
    }
}
void practiceMerge(整数a[],整数低,整数中,整数高)
{
int b[10000];
int i=低,j=中+1,k=0;

而(我让我通过评论您的代码来解释:

//Sort an array a from its index low to its index high by merging two
//subarrays of a that go from low to mid and mid to high.
void practiceMerge(int a[], int low, int mid, int high)
{
    int b[10000]; //Buffer
    int i = low; //starting index in first sub array
    int j = mid + 1; //starting index in second sub array
    int k = 0; //starting index in buffer

    //While you DO NOT go beyond the limit of the first subarray
    //nor the second
    while (i <= mid && j <= high) {
        if (a[i] <= a[j])
            //Put the value of the first subarray, and move 
            b[k++] = a[i++];
        else
            //Put the value of the first subarray, and move
            b[k++] = a[j++];
    }
    //Finish copying first subarray if not done yet
    while (i <= mid)
    b[k++] = a[i++];
    //Finish copying second subarray if not done yet
    while (j <= high)
        b[k++] = a[j++];

    //Copy buffer to array a
    k--;
    while (k >= 0) {
        a[low + k] = b[k];
        k--;
    }
}
在这里,您正在对a的前半部分进行排序

编辑: 您的函数合并数组。主合并排序函数拆分数组。它将是:

void merge_sort(int a[], int lo, int hi) {
   if (low >= hi)
      return; //Nothing to sort
   int mid = (lo+hi)/2; //The guy between lo and hi.
   merge_sort(a,lo, mid); //sort the left
   merge_sort(a, mid, hi); //sort the right
   practiceMerge(a, lo, mid, hi); //This merges the array
}
要理解(不要只是复制粘贴!),可以这样想:merge_sort对数组的一块进行排序,而不是对整个数组进行排序,只对lo和hi之间的位进行排序。为此,它先对一半进行排序,然后对另一半进行排序。然后将结果合并到数组中。因此,在merge_sort中,“hi”和“lo”根据参数计算。现在,您,用户,可能希望对数组从0到结尾,或从第10个索引到第99个索引进行排序。这是您的选择。这是您传递给调用的参数

void main() {
   //Bla bla bla
   merge_sort(songs, 89, 250); //Only sort some songs
}
把它想象成一个黑盒子。你用一些参数来调用它,盒子就完成了它的事情。因为盒子使用它自己,它知道如何调用它自己(也就是说,它知道如何计算低、高和中),但是递归中的初始调用是你作为用户的责任


旁白:我觉得我不是很清楚……

非常感谢你的详尽回答。我困惑的是,关于低和高。我需要从外部(在合并分类之外)找到它们吗。我不知道如何找到这两个值来启动排序。我可能忽略了如何找到它们的简单事实。让我在我的答案中详细说明一下,我现在正在编辑它。这帮了大忙,你的解释很好。作为提示,一切都很清楚。再次感谢你的帮助。“低值和高值来自何处“它们需要从调用函数中提供。检查示例。因此,在调用函数中,数字来自于。但我得到的是,我是否需要使用,例如Min/Max函数来确定这些值。显然,我无法硬编码这些值。如果我有困难,我很抱歉,但我非常感谢您的帮助。
void main() {
   //Bla bla bla
   merge_sort(songs, 89, 250); //Only sort some songs
}