私はこのコードをmergesortのアルゴリズムに従ってXcodeのC言語で書いています。 問題は、時々私はEXC_BAD_ACCESSを取得し、私はどこでエラーを管理することができないということです! マージアルゴリズムが動作するはずです(私はマージソート関数外で試してみました!)。あなたの助けと忍耐ありがとう!mergesort Cの実装
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DIM 6
void mymerge (int v[], int i1,int i2, int last); //mergesort core: merge two ordinated arrays in one bigger ordinated array
void mymergesort (int v[], int lower, int upper);//mergesort
void printv (int v[],int lower, int upper);
int main() {
int i;
srand((unsigned int)time(NULL));
int v[DIM];
for (i=0; i<DIM; i++)
v[i]=rand()%15;
printv(v, 0, DIM-1);
getc(stdin);
mymergesort(v, 0, DIM-1);
printv(v, 0, DIM-1);
}
void printv (int v[],int lower, int upper){
int i;
for (i=lower; i<=upper; i++)
printf("%d\t",v[i]);
}
void mymergesort (int v[], int lower, int upper){
int mid=(upper+lower)/2;
if (upper<lower) {
mymergesort(v, lower, mid);
mymergesort(v, mid+1, upper);
mymerge(v,lower,mid+1,upper);
}
}
void mymerge (int v[], int i1,int i2, int last){
int i=i1,j=i2,k=i1,*vout;
vout=(int*)malloc((last-i1+1)*sizeof(int));
while (i<i2 && j<=last) {
if (v[i]<=v[j]) {
vout[k++]=v[i++];
}else {
vout[k++]=v[j++];
}
}
for (;i<i2;i++) vout[k++]=v[i];
for (;j<=last;j++) vout[k++]=v[j];
for (k=i1; k<=last; k++) v[k]=vout[k];
free(vout);
}
編集: ありがとうございます!私は大きな配列(200要素)をソートしようとすると別の問題があると思うと思いますが、プログラムは動作しません(解放されたオブジェクトのチェックサムが解放された可能性があります)。しかし、xCodeデバッガから実行すると、すべて正常に動作します。
あなたは適切にコードをフォーマットすることができますか? – vpit3833
書式が正しいとは思わない。再試行する?今回はコードタグを使用します。 また、これは宿題としてマークすることもできます。人々はもっと助けてくれるだろう。 – Jeff
申し訳ありませんが、私はコードのフォーマット方法を管理していませんでした!私はそれが宿題ではないのでマークしません:D自由時間のためだけです...:D – tmnd91