[C언어] 두 배열을 정렬된 형태로 합치는 2가지 방법

ET의 공부/C언어|2020. 4. 5. 22:42

안녕하세요 이번 포스팅은 두 배열을 하나의 정렬된 형태로 만드는 방법에 대해 소개해드리겠습니다.

 

두 배열을 합치는 방법으로는 

 

-1. 정렬된 두 배열을 탐색하여 두 배열중 최소 값들로 업데이트

-2. 두 배열을 하나로 합친 뒤 오름차순 정렬

 

1. 최소 값 업데이트로 배열 합치기

 

두 배열을 모두 탐색하여 그중 최솟값을 찾는 방법입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <stdio.h>
 
 
#define ArrLen1 7
#define ArrLen2 5
int main()
{
 
    int arr1[ArrLen1] = {5,3,1,6,8,9,15};
    int arr2[ArrLen2] = {4,2,7,13,11};
    int arr3[ArrLen1 + ArrLen2] ={};
   
    
    
    printf("\nArr1 의 요소: ");
    for(int i = 0; i < ArrLen1; i++)
    {
        printf("%d ",arr1[i]);
    }
    
    //arr1 오름차순 정렬
    for (int i = 0; i < ArrLen1-1; i++)
    {
        for (int j = 0; j < ArrLen1-i-1; j++)
        {
            if (arr1[j] > arr1[j+1])
            {
                int temp = arr1[j];
                arr1[j] = arr1[j+1];
                arr1[j+1= temp;
            }
        }
    }
    
    printf("\n정렬된 Arr1 의 요소: ");
    
    for(int i = 0; i < ArrLen1; i++)
    {
        printf("%d ",arr1[i]);
    }
    
    
    
    
    printf("\nArr2 의 요소: ");
    for(int i = 0;i<ArrLen2;i++)
    {
        printf("%d ",arr2[i]);
    }
    
    //arr2 오름차순 정렬
    for (int i = 0; i < ArrLen2-1; i++)
    {
        for (int j = 0; j < ArrLen2-i-1; j++)
        {
            if (arr2[j] > arr2[j+1])
            {
                int temp = arr2[j];
                arr2[j] = arr2[j+1];
                arr2[j+1= temp;
            }
        }
    }
    printf("\n정렬된 Arr2 의 요소: ");
    
    for(int i = 0; i < ArrLen2; i++)
    {
        printf("%d ",arr2[i]);
    }
    
    
    
    
    int i,j,k;
    i = j = k = 0;
    for(i=0; i < ArrLen1 && j < ArrLen2;)
    {
        if(arr1[i] < arr2[j])
        {
            arr3[k] = arr1[i];
            k++;
            i++;
        }
        else
        {
            arr3[k] = arr2[j];
            k++;
            j++;
        }
    }
    while(i < ArrLen1)
    {
        arr3[k] = arr1[i];
        k++;
        i++;
    }
    while(j < ArrLen2)
    {
        arr3[k] = arr2[j];
        k++;
        j++;
    }
    
    
    
    
    
    printf("\n합쳐진 배열 요소 : ");
    for(i = 0; i < ArrLen1 + ArrLen2; i++)
    {
        printf("%d ",arr3[i]);
    }
    printf("\n");
    return 0;
}
 

 

    int arr1[ArrLen1] = {5,3,1,6,8,9,15};

    int arr2[ArrLen2] = {4,2,7,13,11};

로 배열이 주어졌는데 각 arr1, arr2는 오름차순으로 정렬해주어야 합니다.

14~70번 줄 까지 각각 배열을 오름차순으로 정렬해 주었습니다.

 

 

 

그 뒤 두 배열을 합치는 명령을 수행하게 되는데 

 

  for(i=0; i < ArrLen1 && j < ArrLen2;)

    {

        if(arr1[i] < arr2[j])

        {

            arr3[k] = arr1[i];

            k++;

            i++;

        }

        else

        {

            arr3[k] = arr2[j];

            k++;

            j++;

        }

    }

    while(i < ArrLen1)

    {

        arr3[k] = arr1[i];

        k++;

        i++;

    }

    while(j < ArrLen2)

    {

        arr3[k] = arr2[j];

        k++;

        j++;

    }

 

와 같습니다. 먼저 두 배열의 크기가 같지 않을 수 있으므로  i < ArrLen1 && j < ArrLen2 일 때까지 반복하게 되는데 그 내용으로는

        if(arr1[i] < arr2[j])

        {

            arr3[k] = arr1[i];

            k++;

            i++;

        }

        else

        {

            arr3[k] = arr2[j];

            k++;

            j++;

        }

 

 

두 배열의 요소를 비교하여 작은 값을 arr3에 넣어주고 해당 배열의 index를 증가시켜 줍니다.

저는 arr1의 길이가 7,  arr2의 길이가 5이므로 arr2의 index를 전부 탐색하였다면 for문은 종료됩니다.

 

그 후엔 

    while(i < ArrLen1)

    {

        arr3[k] = arr1[i];

        k++;

        i++;

    }

 

로 나머지 arr1의 요소를 arr3에 넣어 줍니다.

 

 

 

 

 

2. 두 배열을 하나로 합친 뒤 오름차순 정렬

 

두 배열을 하나로 합친 뒤 정렬을 통하는 방법입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
 
 
#define ArrLen1 7
#define ArrLen2 5
int main()
{
 
    int arr1[ArrLen1] = {5,3,1,6,8,9,15};
    int arr2[ArrLen2] = {4,2,7,13,11};
    int arr3[ArrLen1 + ArrLen2] ={};
   
    
    
    printf("\nArr1 의 요소: ");
    for(int i = 0; i < ArrLen1; i++)
    {
        printf("%d ",arr1[i]);
    }
    
    printf("\nArr2 의 요소: ");
    for(int i = 0;i<ArrLen2;i++)
    {
        printf("%d ",arr2[i]);
    }
    
    //arr1과 arr2 합치기
    int i,j;
    for(i = 0; i < ArrLen1; i++)
    {
        arr3[i] = arr1[i];
    }
    for(i = ArrLen1,  j = 0 ; i < ArrLen1 + ArrLen2; i++, j++)
    {
        arr3[i] = arr2[j];
    }
    
    //arr3의 요소
    printf("\nArr3 의 요소: ");
    for(int i = 0;i<ArrLen1+ArrLen2;i++)
    {
        printf("%d ",arr3[i]);
    }
    
    //arr3 오름차순 정렬
    for (int i = 0; i < ArrLen1+ArrLen2-1; i++)
    {
        for (int j = 0; j < ArrLen1+ArrLen2-i-1; j++)
        {
            if (arr3[j] > arr3[j+1])
            {
                int temp = arr3[j];
                arr3[j] = arr3[j+1];
                arr3[j+1= temp;
            }
        }
    }
    
    printf("\n정렬된 arr3 요소 : ");
    for(int i = 0; i < ArrLen1 + ArrLen2; i++)
    {
        printf("%d ",arr3[i]);
    }
    printf("\n");
    return 0;
}
 

 

    for(i = 0; i < ArrLen1; i++)

    {

        arr3[i] = arr1[i];

    }

    for(i = ArrLen1,  j = 0 ; i < ArrLen1 + ArrLen2; i++, j++)

    {

        arr3[i] = arr2[j];

    }

 

를 통해 두 배열을 합쳐줍니다.

ArrLen1의 크기만큼 arr3[i] = arr1[i] 로 arr3에 arr1의 요소를 넣어 준뒤 

i의 초기값은 ArrLen1으로 arr3[ArrLen1 부터 ] = arr2[j] 로 arr2의 요소를 arr3에 넣어주면 정렬된 하나의 배열을 얻을 수 있습니다.

 

 

c언어를 공부하는 과정에서 공부한 것들을 정리한 부분입니다. 미흡한 점이 많으니 지적할 부분을 지적해주시면 감사하겠습니다.

감사합니다. 

 

댓글()