Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这种合并排序有问题_C++_C_Mergesort - Fatal编程技术网

C++ 这种合并排序有问题

C++ 这种合并排序有问题,c++,c,mergesort,C++,C,Mergesort,我想对数组进行排序。 所以我写了这个合并排序,它不做我希望它做的事情,也就是排序,只是暂停! 我一遍又一遍地检查算法,我觉得这是正确的,但不是! 请看一看,告诉我可能出了什么问题 void mergeSort(int *arr, int low, int high){ int mid = (low+high)/2; while(low<high){ mergeSort(arr, low, mid); mergeSort(arr, mid+1, high); merg

我想对数组进行排序。 所以我写了这个合并排序,它不做我希望它做的事情,也就是排序,只是暂停! 我一遍又一遍地检查算法,我觉得这是正确的,但不是! 请看一看,告诉我可能出了什么问题

void mergeSort(int *arr, int low, int high){
int mid = (low+high)/2;
while(low<high){
    mergeSort(arr, low, mid);
    mergeSort(arr, mid+1, high);
    merge(arr, low, high, mid);
}
}

void merge(int *arr,int low, int high, int mid){
int i =low,j=mid+1,k=0;
int temp[50];  // should i new/malloc this with size of ( high -low +1) ?
while(i<=mid && j<=high){
    if(arr[i]<arr[j])
        temp[k++] = arr[i++];
    else
        temp[k++] = arr[j++];
}
while(i<=mid)
    temp[k++] = arr[i++];
while(j<=high)
    temp[k++] = arr[j++];
for(int x = 0; x<=high; x++){
    arr[x]=temp[x];
}
}
void合并排序(int*arr、int-low、int-high){
int mid=(低+高)/2;
while(低
是的,您肯定应该分配正确的存储量

    while(i<=mid && j<=high){
        if(arr[i]<arr[j])
这应该是(int x=low;…

        arr[x]=temp[x];
arr[x]=temp[x-low];
(或使用两个索引)

是的,您肯定应该分配正确的存储量

    while(i<=mid && j<=high){
        if(arr[i]<arr[j])
这应该是(int x=low;…

        arr[x]=temp[x];
arr[x]=temp[x-low];
(或使用两个索引)


要求人们发现代码中的错误是无效的。您应该使用调试器(或添加打印语句)来隔离问题,然后构造一个。
while(low)要求人们发现代码中的错误是无效的。您应该使用调试器(或添加打印语句)要隔离问题,然后构造一个.while(发现了最低错误。遗漏了一个:在最后一个循环中,arr和temp的索引不相同(一个从低开始,另一个从0开始)啊,谢谢。遗漏了
temp
的索引应该从0开始。嘿,谢谢,注意无限循环,如果()而不是while。@KimKardashian使用固定大小的
temp
array将在排序较大的数组时严重崩溃。若您绝对可以保证不会对大于50个元素的数组进行排序,
int temp[50]
就可以了。@Kimkardishan不,因为排序算法
稳定
意味着比较相等的对象在排序数组中的显示顺序与在未排序数组中的显示顺序相同。正如我所说,这与
int
s无关,但如果你按键排序更复杂的对象,比如说按价格排序,则可能很重要。一个是并不总是对排序是否稳定感兴趣,但有时也有一种是稳定的,如果在合并过程中两个比较相等,则从左侧部分获取元素,则合并排序是稳定的排序算法之一。发现了大多数错误。遗漏了一个错误:在最后一个循环中,arr和temp的索引不相同(一个从低开始,另一个从0开始)啊,谢谢。错过了
temp
的索引应该从0开始。嘿,谢谢,处理了无限循环,使用if()而不是while。@KimKardashian使用固定大小的
temp
array将在排序较大的数组时严重崩溃。若您绝对可以保证不会对大于50个元素的数组进行排序,
int temp[50]
就可以了。@Kimkardishan不,因为排序算法
稳定
意味着比较相等的对象在排序数组中的显示顺序与在未排序数组中的显示顺序相同。正如我所说,这与
int
s无关,但如果你按键排序更复杂的对象,比如说按价格排序,则可能很重要。一个是并不总是对排序是否稳定感兴趣,但有时是稳定的,如果在合并过程中两个比较相等,则从左部分提取元素,则合并排序是稳定排序算法之一。
        arr[x]=temp[x];
    }
}