https://visualgo.net/en/sorting

기준점(pivot)을 정한다
기준점보다 작은 데이터는 왼쪽, 큰 데이터는 오른쪽으로 모은다.
나뉘어진 왼쪽, 오른쪽은 다시 각각 기준점을 정하고 기준점보다 작은 데이터는 왼쪽, 큰 데이터는 오른쪽으로 모은다

비주얼고만 보고 구현해봤다. 피벗은 항상 왼쪽끝으로 지정하고 구현해봤다
디버깅하는 시간까지 꽤 오래 걸렸다. 더 간단하게 구현해야야 할까..
메모리는 추가 할당하지 않고 풀 수 있었는데 추가로 메모리를 할당해서 풀면 구조가 더 간단해 지려나?

public class QuickSort {

    private ArrayList<Integer> list;

    QuickSort()
    {
        list = new ArrayList<>();
    }

    void add(Integer value)
    {
        list.add(value);
    }

    void quicksort(int start, int end)
    {
        if(start >= end)
            return;

        int pivot = start;

        int left = start+1;//point bigger value. if not ++
        int right = start+1;//iterater

        while(right <= end)
        {
            if( list.get(pivot) >= list.get(right))
            {
                if(left != right)
                    Collections.swap(list, left, right);

                left++;
            }

            right++;
        }

        Collections.swap(list, start, left-1);

        int leftEnd = left-2;
        if(start < leftEnd)
            quicksort(start, leftEnd);

        if(left < end)
            quicksort(left, end);
    }

    void sort()
    {
        if(list.isEmpty() == true)
            return;
        if(list.size() == 1)
            return;

        quicksort(0, list.size()-1);
    }

    @Override
    public String toString() {
        return "QuickSort{" +
                "list=" + list +
                '}';
    }
}
public class QuickSortTest {

    public static void main(String[] args) {

        QuickSort qs = new QuickSort();

        for(int i = 0; i < 20; ++i)
        {
            qs.add((int)(Math.random()*100));
        }

        qs.sort();

        System.out.println(qs);
    }
}

시간복잡도는 평균 nlogn
최악의 경우 n^2 이다

profile
게임개발자 백엔드개발자

0개의 댓글