Computers/Algorithm

ch 3. 분할 정복법 (divide-and-conquer)

emzei 2016. 3. 24. 21:25
  • 분할 정복법 (divide-and-conquer)
    • 분할 => 해결하기 쉽도록, 문제를 여러개의 작은 부분으로 나눔
    • 정복 => 작게 나뉘어진 문제를 해결
    • 통합 => 필요에 따라 해결된 답을 모음
    • ==>> 하향식(Top-down) 접근법

  • Binary search using recursive method (이분검색, 재귀알고리즘)
    • 문제 : 크기가 n인 정렬된 배열에서 x가 있는지 결정하기
    • 입력 : 비내림차순으로 정렬된 배열(1~n), 찾고자하는 항목(x)
    • 출력 : x가 존재할 경우 해당 위치, 없는 경우 0


  • 합병 정렬 (Merge Sort)
    • 문제 : n개의 정수를 비내림차 정렬
    • 입력: 크기가 n인 배열
    • 출력: 비내림차순으로 정렬된 배열

    • 공간복잡도 향상 시킨 알고리즘 (after. 기억공간 사용 X)
    • 합병정렬 알고리즘 (before)



  • 빠른 정렬 (퀵소트, Quick sort)
    • 사실상 분할교환정렬이 더 옳은 표현
    • 문제 : n개의 정수를 비내림차순으로 정렬
    • 입력 : 크기가 n인 배열
    • 출력 : 비내림차순으로 정렬된 배열
    • 기본 알고리즘 --> 분할 + 교환
      • 퀵소트 기본 알고리즘
      • 분할
        • 문제 : 배열을 2개로 쪼갬
        • 입력 : 인덱스 low, high. 인덱스 low~high에 해당하는 부분배열
        • 출력 : 부분배열의 기준점(피봇, pivot), pivot point

Quick Sort example

#include <stdio.h>


int array[10] = {10,5,2,9,7,6,4,1,8,3};


void partition(int low, int high, int* pivotpoint)

{

        int i, j, pivotitem,swap;


        pivotitem = array[low];

        j = low;


        for(i = low + 1; i <= high; i++)

        {   

                if (array[i] < pivotitem) { 

                        j++;

                        swap=array[j];

                        array[j] = array[i];

                        array[i] = swap;

                }   

        }   

        *pivotpoint=j;

        swap=array[low];

        array[low] = array[j];

        array[j] = swap;

}


void quick_sort(int low, int high)

{

        int pivotpoint;



        if( high > low )

        {   

                partition(low, high, &pivotpoint);

                quick_sort(low, pivotpoint-1);

                quick_sort(pivotpoint+1, high);

        }   

}

int main(void)

{

        int i;


        printf("Original Array : ");

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

                printf("%d ",array[i]);


        printf("\n");

        quick_sort(0, 9); 


        printf("\nSorted Array :   ");

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

                printf("%d ",array[i]);

        printf("\n");

        return 0;

}






  • 큰 정수의 표현
    • 배열 요소마다 각 자릿수 표현
    • 큰 정수의 덧셈, 뺄셈, 곱셈

  • 임계값 결정하기 (determining threshold)
    • 합병 정렬 원리 이용


'Computers > Algorithm' 카테고리의 다른 글

은행가 알고리즘  (0) 2016.03.30
몬테카를로 시뮬레이션  (0) 2016.03.30
ch 3. 동적 프로그래밍 (dynamic programming)  (0) 2016.03.25
ch 2. efficiency and analysis  (0) 2016.03.24
ch1. definition  (0) 2011.10.27