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
#include <stdio.h>
 
void Swap(int arr[], int idx1, int idx2)
{
    int temp = arr[idx1];
    arr[idx1] = arr[idx2];
    arr[idx2] = temp;
}    
 
int MedianOfThree(int arr[], int left, int right)
{
    int samples[3= {left, (left+right)/2, right};
 
    if(arr[samples[0]] > arr[samples[1]])
        Swap(samples, 01);
 
    if(arr[samples[1]] > arr[samples[2]])
        Swap(samples, 12);
 
    if(arr[samples[0]] > arr[samples[1]])
        Swap(samples, 01);
 
    return samples[1];
}
 
int Partition(int arr[], int left, int right)
{
    int pIdx = MedianOfThree(arr, left, right);   // 피벗을 선택!
    int pivot = arr[pIdx];
 
    int low = left+1;
    int high = right;
 
    Swap(arr, left, pIdx);    // 피벗을 가장 왼쪽으로 이동
 
    printf("피벗: %d \n", pivot);
 
    while(low <= high)    // 교차되지 않을 때까지 반복
    {    
        while(pivot >= arr[low] && low <= right)
            low++;
 
        while(pivot <= arr[high] && high >= (left+1))
            high--;
 
        if(low <= high)    // 교차되지 않은 상태라면 Swap 실행
            Swap(arr, low, high);    // low와 high가 가리키는 대상 교환
    }
 
    Swap(arr, left, high);    // 피벗과 high가 가리키는 대상 교환
    return high;    // 옮겨진 피벗의 위치 정보 반환
}
 
void QuickSort(int arr[], int left, int right)
{
    if(left < right)
    {
        int pivot = Partition(arr, left, right);    // 둘로 나눠서 
        QuickSort(arr, left, pivot-1);    // 왼쪽 영역을 정렬
        QuickSort(arr, pivot+1, right);    // 오른쪽 영역을 정렬
    }
}
 
int main(void)
{
    int arr[] = {123456789101112131415};
 
    int len = sizeof(arr) / sizeof(int);
    int i;
 
    QuickSort(arr, 0sizeof(arr)/sizeof(int)-1);
 
    for(i=0; i<len; i++)
        printf("%d ", arr[i]);
 
    printf("\n");
    return 0;
}
cs


+ Recent posts