当前位置: 首页 > 知识库问答 >
问题:

我试图实现合并排序,但得到的输出是相同的数组

丁星火
2023-03-14

我试图实现合并排序,但得到的输出是相同的数组。这种合并排序给了我与输入相同的输出。请帮忙。我很确定这个实现是正确的,我试着调试它,但没有发现错误。

解决:我在比较helper[左]和helper[中]而不是helper right。谢谢帮助的人。

public class Sort {

  public static void main(String[] args){
     int arr[] = {3,5,6,9,0,2,4};
    Sort sort = new Sort();
    int i=0;
    sort.MergeSort(arr);
    for(i=0;i<arr.length;i++){
        System.out.print(arr[i]);
    }
  }


  private void MergeSort(int[] arr2) {
    // TODO Auto-generated method stub
    int helper[] = new int[arr2.length];

    MergeSort(arr2,helper,0,arr2.length-1);


  }


  private  void MergeSort(int[] arr2,int[] helper,int start, int end) {
    if(start<end){
        int mid = (start+end)/2;
        MergeSort(arr2,helper,start,mid);
        MergeSort(arr2,helper,mid+1,end);
        Merge(arr2,helper,start,mid,end);


    }else{
        //do nothing
    }

  }


  private  void Merge(int[] arr2, int[] helper, int start, int mid, int end) {
    // TODO Auto-generated method stub
    int i;
    for(i=start;i<=end;i++){
        helper[i]=arr2[i];
    }
    i=start;
    int left = start;
    int right = mid+1;
    while(left <= mid && right <= end){
        if(helper[left] <= helper[mid]){
            arr2[i] = helper[left];
            left++;
        }else{
            arr2[i] = helper[right];
            right++;
        }
        i++;
    }
        //move remaining of left to array
        int remaining = mid-left;
        int j;
        for(j=0;j<=remaining;j++){
            arr2[i+j]=helper[left+j];
        }
  }
}

共有2个答案

薛烨
2023-03-14

我认为这是您的合并()函数缺少某个大小写。

 //move remaining of left to array
 int remaining = mid-left;
 int j;
 for(j=0;j<=remaining;j++){
     arr2[i+j]=helper[left+j];
 }

处理右子数组是否先耗尽,但不考虑左子数组是否先耗尽的情况(这可能会导致一些不寻常的结果)。我知道这不是您想问的,我会继续查看您的代码,看看我是否可以提供帮助。

编码快乐!如果有任何问题,请留言。

邢硕
2023-03-14

棘手的一个…:-)

您总是将处的元素与处的元素进行比较,而不是处的元素:

while(left <= mid && right <= end){
    if(helper[left] <= helper[mid]){

应该是

while(left <= mid && right <= end){
    if(helper[left] <= helper[right]){

可选,但更明确的是:
此外,正如马特所说,你没有赶上右臂的剩余值

while (left <= mid)
    arr2[i++] = helper[left++];

while (right <= end) {
    arr2[i++] = helper[right++];

编辑:将右臂接球标记为可选

 类似资料:
  • 尝试实现合并排序,下面是代码。如果有什么问题,请告诉我。我的合并功能是否有任何错误?无法指出我的代码中的确切问题。任何关于相同的帮助将不胜感激。 Merge函数用于合并两个排序的数组 递归调用Mergesort 打印函数来打印数组 主要功能

  • 在C:\用户\戴尔\桌面\项目\my-app中创建新的React应用。 安装包。这可能需要几分钟。使用cra模板安装反应、反应-多姆和反应-脚本... NPM ERR!最大调用堆栈大小超过npm ERR!超出最大调用堆栈大小 NPM ERR!此运行的完整日志可以在npm ERR中找到!C:\用户\戴尔\AppData\漫游\npmcache_logs\2020-09-05T07_43_27_276

  • 对于合并排序,我写了这样的代码:我已经测试了合并功能,工作正常。但是在mergeSort函数中,我不能处理数组。它返回与输入列表相同的列表。

  • 下面是我保存在两个变量中的两个数据: 其代码: 我认为这与index_col=0参数有关。但我不知道在不保存它的情况下修复它,这并不重要,但我不得不这样做是一种烦恼。

  • 本文向大家介绍Ruby实现的合并排序算法,包括了Ruby实现的合并排序算法的使用技巧和注意事项,需要的朋友参考一下 算法课的作业,利用分治法,合并排序。

  • 我的两个方法中的操作是相同的,但是输入参数类型不同,那么我该如何优化这两个方法,似乎没有那么重复?因为它们的操作是相同的,但参数类型不同,我该怎么做才能使这段代码更优雅呢?