본문 바로가기

Programming/Algorithm

quick sort

참고 : http://blog.naver.com/kmediart/220552769535




#include <stdio.h>

using namespace std;


#define SWAP(a, b) {int t=a;a=b;b=t;}


// 다른분이 구현한것

int quick_sort(int a[], int left, int right)

{

int i, j;

int pivot_value;

int tmp;              // 치환을 위한 임시 변수



if (left >= right)

{

// 정렬 수행 하지 않음, 즉 정렬할 항목이 하나임.

return 0;

}


i = left + 1;

j = right;


pivot_value = a[left];   // 왼편 끝단의 항목의 값을 Pivot 값으로 선정


while (1)

{

// Pivot 값보다 큰 값 (이상) 일때 까지 i 증가

while ((i <= right) && (a[i] <= pivot_value))

{

i++;

}


// Pivot 값보다 작은 값 (미만) 일때 까지 j 감소        

while ((j >= left) && (a[j] > pivot_value))

{

j--;

}


if (i < j)   // i와 j가 아직 충돌조건이 아니라면 i와 j 항목을 서로 교환

{

tmp = a[i];

a[i] = a[j];

a[j] = tmp;

}

else    // 충돌조건이면, j항목과 pivot 항목을 서로 교환하고 정렬 정지

{

tmp = a[j];

a[j] = pivot_value;

a[left] = tmp;

break;

}

}


// 재귀적으로 교환된 pivot 값의 위치 j 를 기준으로 왼쪽과 오른쪽 데이터를 정렬

quick_sort(a, left, j - 1);

quick_sort(a, j + 1, right);


return 0;

}




// 내가 구현한것

void quick_sort2(int* d, int left, int right)

{

int p, l, r;


if (left >= right)

return;


p = d[left];

l = left + 1;

r = right;


while (1) {

while ((l < right) && (d[l] <= p)) { l++; }

while ((r > left) && (d[r] >= p)){ r--; }


if (l < r) {

SWAP(d[l], d[r]);

}

else {

SWAP(d[left], d[r]);

break;

}

}


quick_sort2(d, left, r - 1);

quick_sort2(d, r + 1, right);

}


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


void print_all()

{

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

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

printf("\n");

}


int main()

{

quick_sort2(g_arr, 0, 9);

print_all();

return 0;


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

std::string c++ 활용 예제  (0) 2018.07.11
std c++ vector 와 sort 사용법 예제  (0) 2018.07.10
visual studio 에서 stack size 유추 / set 하기  (0) 2016.05.12
각종 알고리즘 링크  (0) 2016.03.08
Tree  (0) 2016.03.08