본문 바로가기
알고리즘(C언어)/알고리즘 및 실습 강의

(5)실습5주차_합병정렬과 퀵정렬

by 코잼민 2024. 9. 5.

 

알고리즘 및 실습_5주차.pdf
0.12MB

[문제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
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
 
void Merge(int* A, int start, int mid , int end
{
    int L = start;
    int R = mid + 1;
 
    int* B = (int*)malloc(sizeof(int* (end - start + 1));
    int B_idx = 0;
    while (L<=mid&&R<=end) {
        if (A[L] < A[R]) 
        {
            B[B_idx] = A[L];
            L++;
        }
        else
        {
            B[B_idx] = A[R];
            R++;
        }
 
        B_idx++;
    }
 
    if (L <= mid) 
    {
        while (L <= mid) 
        {
            B[B_idx] = A[L];
            L++;
            B_idx++;
        }
    }
 
    if (R <= end
    {
        while (R <= end)
        {
            B[B_idx] = A[R];
            R++;
            B_idx++;
        }
    }
 
    for (int i = 0; i < (end - start + 1); i++) {
        A[start + i] = B[i];
    }
 
    free(B);
 
}
 
void MergeSort(int* A, int start, int end
{
    if (start + 1 > endreturn;
 
    int mid = (start + end/ 2;
 
    MergeSort(A, start, mid);
    MergeSort(A, mid + 1end);
 
    Merge(A,start,mid,end);
 
}
 
void PrintArr(int* A, int size
{
    for (int i = 0; i < size; i++)printf(" %d", A[i]);
    printf("\n");
}
 
int main() 
{
 
    int N;
    int* A = NULL;
    scanf("%d"&N);
 
    A = (int*)malloc(sizeof(int* N);
 
    for (int i = 0; i < N; i++scanf("%d"&A[i]);
 
    MergeSort(A, 0, N - 1);
 
    PrintArr(A, N);
 
    free(A);
 
    return 0;
}
cs

[문제2]_퀵정렬(오름차순)

##실수한 부분 :

  • 랜덤 피벗 인덱스 지정 : rand() % (end - start + 1)  + start ;
  • 정찰대 2명(L , R) 넘어서기 전 SWAP 과정 : SWAP 후, L++ , R--을 왜하는지를 예시 몇 개 들어서 해보기

##코드 :

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
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#pragma warning (disable : 4996)
 
int findPivot(int start, int end) {
 
    //실수1
    int index = rand() % (end - start + 1+ start;
}
 
int Partition(int* A, int start, int end
{
    int index = findPivot(start, end);
 
    int tmp = A[index];
    A[index] = A[end];
    A[end= tmp;
 
    int L = start;
    int R = end-1;
 
    //1 3(R) 7(L) 6
    while (1) {
        
        while (L <= R && A[L] < A[end]) {
            L++;
        }
 
        while (L <= R && A[R] > A[end]) {
            R--;
        }
 
        if (L <= R) {
            tmp = A[L];
            A[L] = A[R];
            A[R] = tmp;
        
            //실수2??
            L++;
            R--;
        
        }
        else break;
    }
 
    tmp = A[L];
    A[L] = A[end];
    A[end= tmp;
 
    return L;
 
}
 
void QuickSort(int* A, int start , int end
{
    //종료조건
    if (start >= endreturn;
 
    int index =  Partition(A,start,end);
 
    QuickSort(A, start, index - 1);
    QuickSort(A, index+1,end);
 
}
 
void PrintArr(int* A, int size) {
    for (int i = 0; i < size; i++) {
        printf(" %d", A[i]);
    }
    printf("\n");
}
 
int main() 
{
    srand(time(NULL));
 
    int N;
    int* arr = NULL;
    
    scanf("%d"&N);
 
    arr = (int*)malloc(sizeof(int)*N);
 
    for (int i = 0; i < N; i++)scanf("%d"&arr[i]);
    
    QuickSort(arr, 0, N - 1);
 
    PrintArr(arr, N);
 
    free(arr);
 
    return 0;
}
cs