【问题标题】:Implementation of merge sort not working?合并排序的实现不起作用?
【发布时间】:2015-01-03 12:30:20
【问题描述】:

我的数组在运行代码后没有排序。怎么了?

结果:3,8,9,6,11,3,22,95。

我已经尝试了很长时间,但都是徒劳的。

   int main(int argc, char const *argv[]){
        int i;
        int my[]={3,11,19,22,8,9,13,95};
        msort(my,0,7);

        for(i=0;i<8;i++){
           printf("%d,",my[i]);
          }
       return 0;
 }

 int msort(int *ar,int low, int high){
       int mid;
       if(low<high){
          mid = (low+high)/2;

        msort(ar,low,mid);
        msort(ar,mid+1,high);
        merge(ar,low,mid,high);
     }
  }


int merge(int *ar,int low,int mid, int high){
//int ar[]={3,11,19,22};
//int ar2[]={8,9,13,95};
int temp[8];

int i,j,index,k;
k=0;
index=low;
i=low;
j=mid+1;
while(i<=mid && j<=high){
    if(ar[i]<ar[j]){
        temp[index++] = ar[i];
        i++;
    }else{
        temp[index++] = ar[j];
        j++;
    }
}
while(i<j){
    temp[index++] = ar[i];
    i++;

}
while(j<i){
    temp[index++] = ar[j];

    j++;
}

  //here i am updating my array with temp;

for(k=low;k<high;k++){
    ar[k]=temp[k];
}



  }

【问题讨论】:

  • 如果您只使用基指针和长度而不是指针、中指针和高指针,我怎么强调这会变得更容易。即,您是否注意到 aralways 相同的值?如果您在递归时使用 it 进行中点调整,则不必如此。
  • 关于我之前的评论,see it live。除了指针使用之外,您可能会发现合并的高端的复制删除很有趣。如果低端先完成,则剩余的高端已经到位。将其复制到 temp 只是为了将其复制回源数组的高端是没有意义的。无论如何,祝你好运。

标签: c mergesort


【解决方案1】:

您的 while 条件已关闭,需要清空数组 while (j&lt;i) 永远不会为真。

while (i <= mid) { 
    temp[index++] = ar[i];
    i++;
}

while (j <= high) {
    temp[index++] = ar[j];
    j++;
}

【讨论】:

    【解决方案2】:
    int merge(int *ar,int low,int mid, int high){
        int temp[8];
    
        int i,j,index,k;
        k=0;
        index=0;//temp's index start 0;
        i=low;
        j=mid+1;
        while(i<=mid && j<=high){
            if(ar[i]<ar[j]){
                temp[index++] = ar[i];
                i++;
            }else{
                temp[index++] = ar[j];
                j++;
            }
        }
        while(i<=mid){
            temp[index++] = ar[i];
            i++;
        }
        while(j<=high){
            temp[index++] = ar[j];
            j++;
        }
    
        for(k=low, index=0;k<=high;k++){//k include high
            ar[k]=temp[index++];
        }
    }
    

    【讨论】:

    • 请解释这部分 for(k=low, index=0;k
    • @raton k&lt;high --> k&lt;=high,因为high 包含在排序范围内。我认为temp的索引是从0开始的,这很容易理解通用目的。(您需要进行修改以确保它不是未来原始序列的大小。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2019-07-31
    • 2016-08-19
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多