トップダウンマージソートのソースコードを書いたのですが、エラーが出てしまいます。そのエラーはは、実行した時に、int i = atoi(argv[1]); の所にThread1: EXC_BAD_ACCESS (code=1,address=0×0)出てきてしまうというものです。どなたかわかる方がいらっしゃれば教えていただきたいです。
#include <stdio.h>
#include <stdlib.h>
typedef int Item;
#define key(A) (A)
#define less(A, B) (key(A) < key(B))
#define exch(A, B) { Item t = A; A = B; B = t; }
#define compexch(A, B) if (less(B, A)) exch(A, B)
#define maxN 100000
#define M 10
void merge(Item a[], int l, int m, int r);
Item aux[maxN];
void merge(Item a[], int l, int m, int r){
int i, j, k;
for (i = m+1; i > l; i--) aux[i-1] = a[i-1];
for (j = m; j < r; j++) aux[r+m-j] = a[j+1];
for (k = l; k <= r; k++)
if (less(aux[i], aux[j]))
a[k] = aux[i++]; else a[k] = aux[j--];
}
void insertion(Item a[], int l, int r) {
int i;
for (i = r; i > l; i--) compexch(a[i-1], a[i]);
for (i = l+2; i <= r; i++) {
int j = i; Item v = a[i];
while (less(v, a[j-1])) {
a[j] = a[j-1]; j--; } a[j] = v;
}
}
int partition(Item a[], int l, int r) {
int i = l-1, j = r; Item v = a[r];
for (;;) {
while (less(a[++i], v)) ;
while (less(v, a[--j])) if (j == l) break;
if (i >= j) break;
exch(a[i], a[j]); }
exch(a[i], a[r]);
return i;
}
void quicksort(Item a[], int l, int r) {
int i;
if (r-l <= M) return;
exch(a[(l+r)/2], a[r-1]);
compexch(a[l], a[r-1]); compexch(a[l], a[r]); compexch(a[r-1], a[r]);
i = partition(a, l+1, r-1); quicksort(a, l, i-1); quicksort(a, i+1, r);
}
void sort(Item a[], int l, int r) {
int m = (r+l)/2;
if (r <= l) return;
sort(a, l, m);
sort(a, m+1, r);
merge(a, l, m, r);
}
int main(int argc, char argv[]) {
int i = atoi(argv[1]);
int N = atoi(argv[1]);
int sw = atoi(argv[2]);
int a = malloc(Nsizeof(int));
srand(1);
if (sw)
for (i = 0; i < N; i++)
a[i] = 1000(1.0*rand()/RAND_MAX);
else
for (N = 0; scanf("%d", &a[N]) == 1; N++);
sort(a, 0, N-1);
for (i = 0; i < N; i++) printf("%3d ", a[i]);
printf("¥n");
}
回答1件
あなたの回答
tips
プレビュー