'Computer Science/Algorithm'에 해당되는 글 9건

  1. 2014.06.29 Quick Select - Find k-th item in an unsorted array.
  2. 2011.05.30 quick sort - Java
  3. 2011.05.30 quick sort - c
  4. 2011.05.28 insertion sort - c
  5. 2011.05.26 insertion sort - Java
Computer Science/Algorithm2014. 6. 29. 23:17

1. Sort and find: O(nlogn)


2. Quick Select: O(n)

Quick Select: It is similar to Quick Sort about partitioning, but it does not need to sort all elements in an array. The most important thing is the location of pivot. If k, an index of the array, is less than an index of pivot, we need to care about only left part of k. We do not need to worry about a right side of pivot.


Ideal case: n + n/2 + n/4 + .... = n(1 + 1/2 + 1/4 + ....) = n ( 1 / (1 - 1/2) ) = 2n = O(n)

* Sn = a + ar + ar^2 + ar^3 + ... + ar^(n-2) + ar^(n-1) = a / (1 - r)


QuickSelect.groovy

def swap(list, a, b) {
    def temp = list[a]
    list[a] = list[b]
    list[b] = temp
}

def partition(list, pivot, left, right) {
    def storeIdx = left
    swap(list, pivot, right)

    for(int i = left; i < right; ++i) {
        if(list[i] < list[right]) {
            swap(list, i, storeIdx)
            storeIdx++
        }
    }
    swap(list, storeIdx, right)
    return storeIdx
}

def select(list, k, left, right) {
    while(true) {
        def pivot = new Random().nextInt(right - left +1) + left
        println "pivot = " + pivot

        def newPivot = partition(list, pivot, left, right)
        println list

        if(k == newPivot) {
            return list[k]
        } else if (newPivot < k) {
            left = newPivot + 1
        } else {
            right = newPivot - 1
        }
    }
}

def list = [9,8,7,4,5,0,2,1,6,3]
def left = 0
def right = list.size() - 1
def k = new Random().nextInt(right - left + 1 ) + left

println "k = " + k
println list

def answer = select(list, k, left, right)
println "[ANSWER] " + answer






'Computer Science > Algorithm' 카테고리의 다른 글

quick sort - Java  (0) 2011.05.30
quick sort - c  (0) 2011.05.30
insertion sort - c  (0) 2011.05.28
insertion sort - Java  (0) 2011.05.26
binary search - Java  (0) 2011.05.17
Posted by 준피
Computer Science/Algorithm2011. 5. 30. 15:37
Java로 퀵소트를 구현해봤다. 이전에 포인터로 구현을 했을때랑 재귀함수 파라미터에 대한 접근법이 달라서 약간 헷갈렸다.

@Test
public void main(){
int[] x = new int[10];
for (int i = 0; i < x.length; i++) 
x[i] = (int) (Math.random() * x.length);
quicksort(0, x.length-1, x);
}

private void quicksort(int l, int u, int[] x) {
if(u <= l)
return;
int m = l;
for(int i = l + 1; i <= u; ++i) 
if(x[l] > x[i])
swap(++m, i, x);
swap(m, l, x);
quicksort(l, m-1, x);
quicksort(m+1, u, x);
}

private void swap(int a, int b, int[] x) {
int temp = x[a];
x[a] = x[b];
x[b] = temp;
}







'Computer Science > Algorithm' 카테고리의 다른 글

Quick Select - Find k-th item in an unsorted array.  (0) 2014.06.29
quick sort - c  (0) 2011.05.30
insertion sort - c  (0) 2011.05.28
insertion sort - Java  (0) 2011.05.26
binary search - Java  (0) 2011.05.17
Posted by 준피
Computer Science/Algorithm2011. 5. 30. 14:52
퀵소트를 c로 구현해봤다. 퀵소트는 처음부터 재귀호출을 이용해서 구현했다.

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include <time.h>


void print_array(int *x, int n);

int* scaffolding(int n);

void quicksort(int *x, int n);

void swap(int *, int *);


int main() {

int *x, n, i;


printf("배열 크기 : ");

scanf("%d", &n);

x = scaffolding(n);

print_array(x, n);


quicksort(x, n);

print_array(x, n);


return 0;

}


void quicksort(int *x, int n) {

if(n <= 1)

return;


int i, m = 0;


for(i = 1; i < n ; ++i) {

if(x[0] > x[i]) {

swap(&x[++m], &x[i]);

}

}

swap(&x[m], &x[0]);

quicksort(x, m);

quicksort(x+m+1, n-m-1);

}


void swap(int *a, int *b) {

int temp = *a;

*a = *b;

*b = temp;

}


void print_array(int *x, int n) {

int i;

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

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

printf("\n");

}


int* scaffolding(int n) {

srand((unsigned) time(NULL));

int *x, i;


x = (int *)malloc(n * sizeof(int));

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

x[i] = rand() % n;


return x;

}


밑의 함수는 정렬하는 부분만 다른 알고리즘으로 풀어봤다.

void quicksort(int *x, int n) {

if(n <= 1)

return;


int l = 0, u = n;

while(1) {

do {++l;} while(x[0] > x[l] && l < n);

do {--u;} while(x[0] <= x[u] && u > 0);

if(u < l)

break;

swap(&x[l], &x[u]);

}

swap(&x[0], &x[u]);

quicksort(x, u);

quicksort(x+u+1, n-u-1);

}




'Computer Science > Algorithm' 카테고리의 다른 글

Quick Select - Find k-th item in an unsorted array.  (0) 2014.06.29
quick sort - Java  (0) 2011.05.30
insertion sort - c  (0) 2011.05.28
insertion sort - Java  (0) 2011.05.26
binary search - Java  (0) 2011.05.17
Posted by 준피
Computer Science/Algorithm2011. 5. 28. 21:09
삽입정렬을 c로 구현해봤다. 이진탐색을 구현하면서 포인터에 익숙해진터라 좀 더 수월하게 작업했다.

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>

int* scaffolding(int);
void print_array(int *, int);
void insertionsort(int *, int);

int main() {
int *x, n, i;
printf("배열 크기 : ");
scanf("%d", &n);
x = scaffolding(n);
printf("입력 : ");
print_array(x, n);

insertionsort(x, n);
printf("결과 : ");
print_array(x, n);

return 0;
}

void insertionsort(int *x, int n) {
int i, j;
for(i = 1; i < n; ++i){
for(j = i; j > 0 && x[j-1] > x[j]; --j){
int temp = x[j-1];
x[j-1] = x[j];
x[j] = temp;
}
}
}

void print_array(int *x, int n) {
int i;
for(i = 0; i < n; ++i)
printf("%d ", x[i]);
printf("\n");
}

int* scaffolding(int n) {
srand((unsigned) time(NULL));
int *x, i;

x = (int *)malloc(n * sizeof(int));
for(i = 0; i < n; ++i)
x[i] = rand() % n;

return x;
}


위의 삽입정렬에서 배열의 값을 swap 해주는 부분만 알고리즘을 바꿔봤다.
메모리에 쓰는 작업을 덜하기 때문에 좀 더 효율적이다.

void insertionsort(int *x, int n) {
int i, j, temp;
for(i = 1; i < n; ++i){
temp = x[i];
for(j = i; j > 0 && x[j-1] > temp; --j)
x[j] = x[j-1];
x[j] = temp;
}
}





'Computer Science > Algorithm' 카테고리의 다른 글

quick sort - Java  (0) 2011.05.30
quick sort - c  (0) 2011.05.30
insertion sort - Java  (0) 2011.05.26
binary search - Java  (0) 2011.05.17
binary search - c  (0) 2011.05.16
Posted by 준피
Computer Science/Algorithm2011. 5. 26. 23:03
삽입 정렬을 자바로 작성해봤다.

@Test
public void insertionSort() 
{
int[] x = new int[10];
for (int i = 0; i < x.length; i++)
x[i] = (int) (Math.random() * x.length);
for(int i = 1; i < x.length; ++i){
for(int j = i; j > 0; --j){
if(x[j] < x[j-1]){
int temp = x[j-1];
x[j-1] = x[j];
x[j] = temp;
}
}
}
}


이번 삽입 정렬은 swap을 하지 않는 방식으로 해봤다.

@Test
public void insertionSort2() 
{
int[] x = new int[10];
for (int i = 0; i < x.length; i++)
x[i] = (int) (Math.random() * x.length);
int i, j, temp;
for(i = 1; i < x.length; ++i){
temp = x[i];
for(j = i; j > 0 && x[j-1] > temp; --j)
x[j] = x[j-1];
x[j] = temp;
}
}



'Computer Science > Algorithm' 카테고리의 다른 글

quick sort - c  (0) 2011.05.30
insertion sort - c  (0) 2011.05.28
binary search - Java  (0) 2011.05.17
binary search - c  (0) 2011.05.16
반전 알고리즘  (0) 2011.05.12
Posted by 준피