문자열 입력받아서 병합정렬하려고하는데
잘안되네요
해결해주시면 사례하겠습니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void merge(char arr[][501], int l, int m, int r) {
int i = l;
int j = m + 1;
int c = l;
char** arr2 = (char**)malloc(sizeof(char*) * (r + 2));
for (int i = 0; i < r + 1; i++) {
arr2[i] = (char*)malloc(sizeof(char) * (501));
}
while (i <= m && j <= r) {
if (strlen(arr[i]) > strlen(arr[j])) { // 길이 비교해서 짧은 항목 저장
strcpy(arr2[c], arr[j]);
c++; j++;
}
else if (strlen(arr[i]) < strlen(arr[j])) { // 길이 비교해서 짧은 항목 저장
strcpy(arr2[c], arr[i]);
c++; i++;
}
else // 길이가 같을경우 사전식 배열
{
if (arr[i] > arr[j]) {
strcpy(arr2[c], arr[i]);
c++; i++;
}
else {
strcpy(arr2[c], arr[j]);
c++; j++;
}
}
}
while (i <= m) { //남은 항목 저장
strcpy(arr2[c], arr[i]);
c++; i++;
}
while (j <= r) { // 남은 항목 저장
strcpy(arr2[c], arr[j]);
c++; j++;
}
for (int k = l; k <= r; k++) //다시 배열에 덮어쓰기
{
strcpy(arr[k], arr2[k]);
}
free(arr2);
}
void mergesort(char arr[][501], int l, int r) {
if (l < r) {
int m = (l + r) / 2;
mergesort(arr, l, m);
mergesort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
int main() {
int n = 0;
int m = 0;
scanf("%d", &n);
char** list = (char**)malloc(sizeof(char*) * (n + 1)); // 문자열 배열 생성
for (int i = 0; i < n; i++) {
list[i] = (char*)malloc(sizeof(char) * (501));
}
for (int i = 0; i < n; i++) {
scanf("%s", list[i]);
}
mergesort(list, 0, n - 1);
printf("======\n");
for (int i = 0; i < n; i++) {
printf("%s\n", list[i]);
}
}
알려줘잉
mergesort() 함수 내에서 재귀 호출할 때 배열의 인덱스 범위를 올바르게 설정해야 합니다. 현재 코드에서는 m 값을 기준으로 왼쪽 부분과 오른쪽 부분을 나누고 재귀 호출하고 있지만, 올바른 인덱스 범위로 설정되지 않았습니다. l부터 m까지의 범위와 m+1부터 r까지의 범위를 재귀 호출해야 합니다.
이미 l~m 까지한번, m+1~r까지 한번 실행되고 있는거 아닌가요? 혹시 어느부분 말하시는건가요
oid mergesort(char arr[][501], int l, int r) { if (l < r) { int m = (l + r) / 2; mergesort(arr, l, m); mergesort(arr, m + 1, r); merge(arr, l, m, r); }
이부분 맞나요
사전식 배열을 비교할 때 arr[i]와 arr[j]를 비교하기 위해 > 연산자를 사용하고 있습니다. 그러나 arr[i]와 arr[j]는 문자열의 주소를 나타내는 포인터이므로, 주소를 비교하는 것은 의도한 동작이 아닙니다. 문자열을 비교하기 위해서는 strcmp() 함수를 사용해야 합니다. 따라서 다음과 같이 수정해야 합니다 if (strcmp(arr[i], arr[j]) > 0) {
네 이부분은 직후 수정했으나 여전히 배열도 안되고 첫 출력도 null이 출력되는거 같은데 왜그럴까요...