study2015. 1. 9. 15:39

#include <stdio.h>
#define MAX_LEN 10

void swap(int*a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}

int partition(int d[], int l, int r) //l is left, r is right.
{

int first = l;
int pivot = d[first];
++l; //shift.

while (l < r)

{
while (d[l] <= pivot)
++l;
while (d[r] > pivot)
--r;

if (l < r)
swap(&d[r], &d[l]);
else
break;
}

swap(&d[first], &d[r]);
return r;
}


int partition2(int d[], int l, int r) // p is pivot index.

{

int last = d[r];
int sortIdx = l;

for (int i = l; i <= r-1; i++)

{

if (d[i] <= last)
{
swap(&d[i], &d[sortIdx]);
sortIdx++;
}
}

swap(&d[sortIdx], &d[r]);
return sortIdx;

}

void qsort(int d[], int l, int r)

{
printf("l=%d, r=%d\n", l, r);

if (r > l){
//int idx = partition(d, l, r);
int idx = partition2(d, l, r);
qsort(d, l, idx - 1);
qsort(d, idx + 1, r);
}
}


int main()

{

int i = 1;

int j = 2;

int data[MAX_LEN] = { 3, 7, 8, 5, 2, 1, 9, 5, 4, 6};
qsort(data, 0, MAX_LEN-1);

for (int k = 0; k < MAX_LEN; k++)
     {
    printf("%d,", data[k]);

}

printf("\n%d\n", i);

}


분할 정복 알고리즘의 대표적인 소팅 알고리즘 partition 값을 구하는 방법은 전통적인 알고리즘 버젼과 MIT에서 제안한 방법 2가지 모두 구현해 보았다.

Posted by 평면우주