【问题标题】:How do I make this merge sort go in descending order rather than ascending?如何使此合并排序按降序而不是升序进行?
【发布时间】:2013-05-18 20:23:47
【问题描述】:

这可能是一个相当简单的问题。我只是不知道如何按降序而不是升序进行排序。谁能帮帮我?

public static void sortYear(Movie4[] movies, int low, int high)
{
    if ( low == high ) 
        return; 
    int mid = ( low + high ) / 2; 
    sortYear( movies, low, mid ); 
    sortYear( movies, mid + 1, high ); 

    mergeYears(movies, low, mid, high ); 
}

public static void mergeYears(Movie4[] movies, int low, int mid, int high)
{

    Movie4[] temp = new Movie4[ high - low + 1 ]; 
    int i = low, j = mid + 1, n = 0; 
    while ( i <= mid || j <= high ) 
    { 
        if ( i > mid ) 
        { 
            temp[ n ] = movies[ j ]; 
            j++; 
        } 
        else if ( j > high ) 
        { 
            temp[ n ] = movies[ i ]; 
            i++; 
        } 
        else if ( movies[ i ].getYear() < movies[ j ].getYear()) 
        {   
            temp[n] = movies[i];
            i++;
        }
        else
        {
            temp[n] = movies[j];
            j++;
        }
        n++;
    }   
    for ( int k = low ; k <= high ; k++ ) 
    {
        movies[ k ] = temp[ k - low ]; 
    }
}

【问题讨论】:

  • 是的,他是这么说的……就在问题的最后……
  • 这是家庭作业,但不是全部问题。我必须使用降序合并排序编写程序,但我无法弄清楚。查一下没有错。
  • "so I'm just going to keep typing for a little while" - 是的,你不应该那样做。

标签: java mergesort


【解决方案1】:

为了帮助您自己回答问题,我将在代码中添加一些 cmets。

所有真正的工作都在mergeYears:

public static void mergeYears(Movie4[] movies, int low, int mid, int high)
{

    Movie4[] temp = new Movie4[ high - low + 1 ]; 

    // 'i' tracks the index for the head of low half of the range.
    // 'j' tracks the index for the head of upper half of the range.
    int i = low, j = mid + 1, n = 0; 

    // While we still have a entry in one of the halves.
    while ( i <= mid || j <= high ) 
    { 
        // Lower half is exhausted.  Just copy from the upper half.
        if ( i > mid ) 
        { 
            temp[ n ] = movies[ j ]; 
            j++; 
        } 
        // Upper half is exhausted. Just copy from the lower half.
        else if ( j > high ) 
        { 
            temp[ n ] = movies[ i ]; 
            i++; 
        } 
        // Compare the two Movie4 objects at the head of the lower and upper halves.
        // If lower is less than upper copy from lower.
        else if ( movies[ i ].getYear() < movies[ j ].getYear()) 
        {   
            temp[n] = movies[i];
            i++;
        }
        // Lower is is greater than upper.  Copy from upper.
        else
        {
            temp[n] = movies[j];
            j++;
        }
        n++;
    }

    // Copy from the temp buffer back into the 'movie' array.
    for ( int k = low ; k <= high ; k++ ) 
    {
        movies[ k ] = temp[ k - low ]; 
    }
}

【讨论】:

    【解决方案2】:

    要更改排序顺序,您必须担心它们比较对象值的确切位置。在您的情况下,这在下面的行中。

    只要改变这个:

    else if ( movies[ i ].getYear() < movies[ j ].getYear()) 
    

    到这里:

    else if ( movies[ i ].getYear() > movies[ j ].getYear()) 
    

    请注意,唯一改变的是 &gt; 运算符。

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 2018-11-20
      • 2020-11-09
      • 1970-01-01
      • 2018-05-03
      • 2017-06-10
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      相关资源
      最近更新 更多