控制不进入函数内部(合并排序)
control not going inside the function(merge sort)
当我调试它时,光标甚至没有进入 msort 函数内部,这有助于我解决代码中的问题
#include<stdio.h>
#include<conio.h>
void merge(int arr[],int low,int mid,int high){
int i=0,j=mid+1,brr[high-low+1],k=0;
while(i<=mid&&j<=high){
if(arr[i]<=arr[j]) brr[k++]=arr[i++];
else brr[k++]=arr[j++];
}
if(j<high) while(j<=high) brr[k++]=arr[j++];
else while(i<=mid) brr[k++]=arr[i++];
for(k=low;k<=high;k++){
arr[k]=brr[k];
}
}
void msort(int arr[],int low,int high){
int mid=(low+high)/2;
if(low<high){
msort(arr,low,mid);
msort(arr,mid+1,high);
merge(arr,low,mid,high);
}
}
void main(){
int arr[]={23,54,-1,76,1,90,34,56};
int len=8;
printf("before sorting");
for(int i=0;i<len;i++) printf("%d,",arr[i]);
printf("\nafter sorting");
msort(arr,0,len-1);
for(int i=0;i<len;i++) printf("%d",arr[i]);
}
光标停在 msort() 函数处,程序正在终止
您很可能因超出数组边界而导致未定义行为而导致崩溃:
for (k = low; k <= high; k++)
{
arr[k] = brr[k];
// ^ (!)
}
k
从 low
上升到 high
包括,brr
的有效索引是从 0 到 high - low
,但你超过了由 low
个元素构成的数组(并在开头跳过那么多元素)。
for (k = low; k <= high; k++)
{
arr[k] = brr[k - low];
// ^^^^^
}
问题已解决。
当我调试它时,光标甚至没有进入 msort 函数内部,这有助于我解决代码中的问题
#include<stdio.h>
#include<conio.h>
void merge(int arr[],int low,int mid,int high){
int i=0,j=mid+1,brr[high-low+1],k=0;
while(i<=mid&&j<=high){
if(arr[i]<=arr[j]) brr[k++]=arr[i++];
else brr[k++]=arr[j++];
}
if(j<high) while(j<=high) brr[k++]=arr[j++];
else while(i<=mid) brr[k++]=arr[i++];
for(k=low;k<=high;k++){
arr[k]=brr[k];
}
}
void msort(int arr[],int low,int high){
int mid=(low+high)/2;
if(low<high){
msort(arr,low,mid);
msort(arr,mid+1,high);
merge(arr,low,mid,high);
}
}
void main(){
int arr[]={23,54,-1,76,1,90,34,56};
int len=8;
printf("before sorting");
for(int i=0;i<len;i++) printf("%d,",arr[i]);
printf("\nafter sorting");
msort(arr,0,len-1);
for(int i=0;i<len;i++) printf("%d",arr[i]);
}
光标停在 msort() 函数处,程序正在终止
您很可能因超出数组边界而导致未定义行为而导致崩溃:
for (k = low; k <= high; k++)
{
arr[k] = brr[k];
// ^ (!)
}
k
从 low
上升到 high
包括,brr
的有效索引是从 0 到 high - low
,但你超过了由 low
个元素构成的数组(并在开头跳过那么多元素)。
for (k = low; k <= high; k++)
{
arr[k] = brr[k - low];
// ^^^^^
}
问题已解决。