7.19.2017

자료구조 QuickSort

/*
1. 데이터 집합 내에서 임의의 기준 요소를 선택하고, 기준요소보다 작은 요소들은 순서에 관계없이 무조건 기준 요소의 왼편에, 큰 값이 오른편에 위치시킵니다.
2. 기준 요소 오니편에는 기준 요소보다 작은 요소들이 모여있고 오른편에는 큰 요소들이 모여있습니다.
이렇게 나눈 데이터 집합들을 다시 1에서와 같이 임의의 기준 요소를 선택하고 같은 방법으로 데이터 집합을 분할합니다.
3. 1과 2의 과정을 더 이상 데이터 집합을 나눌 수 없을 때까지 반복하면 정렬된 데이터 집합을 얻게됩니다. */

//방법1. swap함수 만들어 사용하기

#include <stdio.h>

void swap(int *xint *y) {
        int temp = *x;
        *x = *y;
        *y = temp;
}

int Partition(int DataSet[], int Leftint Right) {
        int First = Left;
        int Pivot = DataSet[First];

        ++Left;

        while (Left<=Right) {
                while (DataSet[Left]<=Pivot && Left<Right)
                ++Left;
                while (DataSet[Right]>Pivot && Left<=Right)
                --Right;

                if (LeftRight)
                        swap(&DataSet[Left], &DataSet[Right]);
                else break;
        }
        swap(&DataSet[Right], &DataSet[First]);
        return Right;
}

void QuickSort(int DataSet[], int Leftint Right) {
        if (LeftRight) {
                int index = Partition(DataSetLeftRight);

                //재귀 2번 (왼쪽 파티션에 대한 재귀, 오른쪾 파티션에 대한 재귀)
                QuickSort(DataSetLeft, index - 1);
                QuickSort(DataSet, index + 1, Right);
        }
}

void sort(int DataSet[], int lint r) {
        int left = l;
        int right = r;
        int pivot = DataSet[(l + r) / 2];

        do {
                while (DataSet[left] < pivot) left++;
                while (DataSet[right] > pivot) right--;
                if (left <= right) {
                        swap(&DataSet[left], &DataSet[right]);
                        left++;
                        right--;
                }
        } while (left <= right);

        if (l < right) sort(DataSet, l, right);
        if (r < left) sort(DataSet, left, r);
}

void main() {
        int DataSet[] = { 6,4,2,3,1,5 };
        int Length = sizeof(DataSet) / sizeof(int);
        QuickSort(DataSet, 0, Length - 1);
        for (int i = 0; i < Length; i++)
                printf("%d", DataSet[i]);
        printf("\n");
}

=========================================================================
//방법2. 라이브러리의 qsort함수 이용하기

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

/*
void qsort(
        void *base, : 데이터 집합 배열의 주소
        size_t num, : 데이터 요소의 개수
        size_t width : 한 데이터 요소의 크기
        int(_cdecl *compare)(const void *, const void *)
        비교함수에 대한 포인터
)
int compare((void *)&elem1, (void *)& elem2);
*/
/*
return 값이
<0 : _elem1이 _elem2보다 작다.
0 : 같다
>0 : _elem1이 _elem2보다 크다.
*/

int CompareScore(const void*_elem1, const void*_elem2) {
        int* elem1 = (int *)_elem1;
        int* elem2 = (int *)_elem2;

        if (*elem1 > *elem2) return 1;
        else if (*elem1 < *elem2) return -1;
        else return 0;
}

void main() {
        int DataSet[] = { 6,4,2,3,1,5 };
        int Length = sizeof(DataSet) / sizeof(int);
        qsort((void*)DataSet, Length, sizeof(int), CompareScore);

        for (int i = 0; i < Length; i++)
                printf("%d", DataSet[i]);
        printf("\n");
}
=========================================================================
//출력

댓글 없음:

댓글 쓰기