๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Programming/์•Œ๊ณ ๋ฆฌ์ฆ˜

#3. ํ•ฉ๋ณ‘ ์ •๋ ฌ, ํ€ต ์ •๋ ฌ

728x90
๋ฐ˜์‘ํ˜•

ํ•ฉ๋ณ‘ ์ •๋ ฌ

 

ex) n๊ฐœ์˜ ์–‘์˜ ์ •์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์›์†Œ๋“ค์„ ํ•ฉ๋ณ‘์ •๋ ฌํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void makeList (int* L, int n) {
    for (int i = 0; i < n; i++) {
        scanf("%d", &L[i]);
    }
}

void merge (int* L1, int* L2, int left, int mid, int right) {
    int i ,j, k, l;
    i = left;
    j = mid + 1;
    k = left;

    while (i <= mid && j <= right) {
        if (L1[i] <= L1[j]) 
            L2[k++] = L1[i++];
        else 
            L2[k++] = L1[j++];
    }

    if (i > mid) {
        for (l = j; l <= right; l++) {
            L2[k++] = L1[l];
        }
    }
    else {
        for (l = i; l <= mid; l++) {
            L2[k++] = L1[l];
        }
    }
    
    for (l = left; l <= right; l++) {
        L1[l] = L2[l];
    }
}

void mergeSort (int* L1, int* L2, int left, int right) {
    
    int mid;

    if (left < right) {
        mid = (left + right) / 2;
        mergeSort(L1, L2, left, mid);
        mergeSort(L1, L2, mid + 1, right);
        merge(L1, L2, left, mid, right);
    }
}

void printList (int* L, int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", L[i]);
    }
    printf("\n");
}


//๋ฐฐ์—ด๋กœ ๊ตฌํ˜„
int main () {

    int n;
    scanf("%d", &n);

    int* L1 = (int*)malloc(sizeof(int) * n);
    int* L2 = (int*)malloc(sizeof(int) * n);

    makeList(L1, n);

    mergeSort(L1, L2, 0, n - 1);
    printList(L2, n);
    

    return 0;
}

 

 

 

 

ํ€ต ์ •๋ ฌ

 

: ๋ถ„ํ• ํ†ต์น˜๋ฒ•์— ๊ธฐ์ดˆํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

divide : ๊ธฐ์ค€์›์†Œp(๋ณดํ†ต ๋งˆ์ง€๋ง‰ ์›์†Œ)๋ฅผ ์„ ํƒํ•˜์—ฌ L์„ 3๋ถ€๋ถ„์œผ๋กœ ๋ถ„ํ•   

 

LT : p๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋“ค

EQ : p์™€ ๊ฐ™์€ ์›์†Œ๋“ค

GT : p๋ณด๋‹ค ํฐ ์›์†Œ๋“ค

 

 

์žฌ๊ท€(recur) : LT, GT ์ •๋ ฌ

ํ†ต์น˜(conquer) : LT, EQ, GT ๊ฒฐํ•ฉ

 

 

 

list ๋ถ„ํ• (partition)

 

1. L๋กœ๋ถ€ํ„ฐ ๊ฐ ์›์†Œ e ์‚ญ์ œ

2. e๋ฅผ ๊ธฐ์ค€์›์†Œ์ธ p์™€ ๋น„๊ต๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋ถ€list LT,EQ,GT์— ์‚ฝ์ž…

 

 

 

์ œ์ž๋ฆฌ ํ€ต ์ •๋ ฌ

 

 

์ œ์ž๋ฆฌ ๋ถ„ํ• 

 

 

ex) n๊ฐœ์˜ ์–‘์˜ ์ •์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ํ€ต ์ •๋ ฌ๋กœ ์ •๋ ฌ. pivot์˜ ์œ„์น˜๋Š” randomํ•˜๊ฒŒ ์„ ํƒ

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SWAP(x,y,t) ((t) = (x), (x) = (y), (y) = (t))

void makeList (int* L, int n) {
    for (int i = 0; i < n; i++) {
        scanf("%d", &L[i]);
    }
}

void printList (int* L, int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", L[i]);
    }
    printf("\n");
}

int partition (int *L, int left, int right, int p) {
    
    int pivot, tmp, low, high;

    pivot = L[p];
    SWAP(L[p], L[right], tmp);    //pivot์œ„์น˜ ๋ณ€๊ฒฝ(์˜ค๋ฅธ์ชฝ)

    low = left;
    high = right - 1;

    while (low <= high) {
        while (low <= high && L[low] <= pivot) {
            low++;
        }
        while (high >= low && L[high] >= pivot) {
            high--;
        }
        if (low < high) {
            SWAP(L[low], L[high], tmp);
        }
    }

    //pivot์œ„์น˜ ์ •ํ•จ
    SWAP(L[low], L[right], tmp);

    return low;
}

void quickSort  (int* L, int left, int right) {
    if (left < right) {
        int p = rand() % (right - left + 1) + left;     //pivot ์„ค์ •
        int q = partition(L, left, right, p);       //sortํ›„ pivot ์œ„์น˜
        quickSort(L, left, q - 1);
        quickSort(L, q + 1, right);
    }
}

//๋ฐฐ์—ด๋กœ ๊ตฌํ˜„
int main () {

    int n;
    scanf("%d", &n);

    int* L = (int*)malloc(sizeof(int) * n);

    makeList(L, n);
    // printList(L, n);

    quickSort(L, 0, n-1);
    printList(L, n);


    return 0;
}

 

728x90
๋ฐ˜์‘ํ˜•

'Programming > ์•Œ๊ณ ๋ฆฌ์ฆ˜' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

#2. ํž™๊ณผ ํž™์ •๋ ฌ  (2) 2022.09.15
#1. ์šฐ์„ ์ˆœ์œ„ ํ  (0) 2022.09.07