합병정렬 질문입니다 ㅠㅠ

N 개의 random number 들에 대해 합병정렬을 하는건데 수업시간에 배운거에 이것저것해보려하는데 잘안되네요… 난수 생성하기전에 혼자 배열[10] 이런식으로 넣고했을때는 됬는데 난수에 대한 개념을 잘모르는상태로 일단 구글링을통해서 만들긴했는데 어느부분이 문제일까요

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void mergeSort(int data[], int p, int r);
void merge(int data[], int p, int q, int r);

int main() {
	srand(time(NULL));

	int data[1000];
	for (int i = 0; i < 1000; i++) {
		data[i] = rand();
	}
	printf("정렬 전\n");
	for (int i = 0; i < 1000; i++) {
		printf("%d ", data[i]);
	}
	mergeSort(data, 0, 999);
	printf("\n정렬 후\n");
	for (int i = 0; i < 999; i++) {
		printf("%d ", data[i]);
	}
	return 0;
}
void mergeSort(int data[], int p, int r) {
	int q;
	if (p < r) {
		q = (p + r) / 2;
		mergeSort(data, p, q);
		mergeSort(data, q + 1, r);
		merge(data, p, q, r);
	}
}
void merge(int data[], int p, int q, int r) {
	int i = p, j = q + 1, k = p;
	int tmp[1000];
	while (i <= q && j <= r) {
		if (data[i] <= data[j])tmp[k++] = data[i++];
		else tmp[k++] = data[j++];
	}
	while (i <= q) tmp[k++] = data[i++];
	while (j <= r) tmp[k++] = data[j++];
	for (int a = p; a <= r; a++)data[a] = tmp[a];
}

잘 되는데요…

N개는 1000, 2000 , 3000 다해보라해서 일단 1000넣은값으로 한거에요!

어느 부분에서 작동하지 않는지 알려주셔야 상세한 답변이 가능합니다.

임의로 코드를 예뻐보이게 바꿨습니다. 일단 루프를 어떨 때는 1000까지, 어떨 때는 999까지 돌리는게 걸립니다.