准备找工作面试了,复习复习归并排序。自己写了一个,漏洞百出,但是最致命点是。函数递归时很容易发生内核崩溃的问题。
最开始我是怀疑由于指针越界引起的,检查一圈没有越界的情况。然后我就进一步怀疑是不是出现了死递归,但是也没有。
优哉游哉,辗转反侧,万般无奈之下,我只看到一个未初始化的局部变量。
我将这个倒霉的变量初始化后,问题解决啦。
现在反过来看,其实还是指针越界啦。由于未初始化,所以变量初始值为垃圾数字,导致最终越界。
问题随蠢,但是还是记录一下吧。
#include <stdio.h>
#include <stdlib.h>
#define NUM 30
void merge(int *arr,int a,int mid,int b){
int *tmp = malloc(sizeof(int) * (b-a+1));
int i,j,k;
i=a;
j=mid;
k=0; // 事故现场,就是他
while(i<mid && j<=b){
if(arr[i] < arr[j])
tmp[k++] = arr[i++];
else
tmp[k++] = arr[j++];
}
while(i<mid){
tmp[k++] = arr[i++];
}
while(j<=b){
tmp[k++] = arr[j++];
}
for(i=a,j=0;i<=b;i++,j++){
arr[i] = tmp[j];
}
free(tmp);
}
void twosort(int *arr,int a,int b){
int tmp;
if(arr[b] < arr[a]){
tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
}
void mergesort(int *arr,int a,int b){
int mid=0;
mid=(a+b)/2;
if(mid-a >=2)
mergesort(arr,a,mid);
else
twosort(arr,a,mid);
if(b-mid >= 3)
mergesort(arr,mid+1,b);
else
twosort(arr,mid+1,b);
merge(arr,a,mid+1,b);
}
int main(int argc,char **argv){
int i = 0;
int arr[NUM]={};
for(i=0;i<NUM;i++)
arr[i] = random()%100;
for(i=0;i<NUM;i++)
printf("%d ",arr[i]);
printf("\n");
mergesort(arr,0,NUM-1);
for(i=0;i<NUM;i++)
printf("%d ",arr[i]);
printf("\n");
}