JuSeok

QuickSort

QuickSort 알고리즘이란

  • QuickSort 알고리즘은 pivot을 기준으로 pivot보다 작은 값을 pivot 왼쪽에, 큰 값을 pivot 오른쪽에 정렬하는 알고리즘이다. (오름차순 기준)
  • pivot을 기준으로 해 좌우로 값을 보내고 난 후 start에서 pivot - 1, pivot + 1에서 last를 재귀 호출해 주면 된다.
  • 코드 주석을 확인하며 디버깅하면 무슨 뜻인지 쉽게 알 수 있을 것이다.

보통 pivot은 배열의 중간 값으로 많이 정한다고 하는데 아래 예제에서는 배열의 마지막 값으로 정했다.

import java.util.Scanner;

public class QuickSort {
    public int partition(String A[], int first, int last) {

        String pivot = A[last]; // 정렬 기준이 될 pivot을 배열 맨 마지막 원소로 정함.
        int i = first - 1; // 정렬할

        for (int j = first; j < last; j++) { // first부터 last까지 반복
            if (A[j].compareTo(pivot) < 0) { // j번째와 pivot을 비교하여 j번째가 더 작으면 조건 true
                // compareTo 연산자는 두개의 값을 비교함. (리턴 값이 음수인 경우 A[j]이 pivot 보다 사전적으로 앞서있음을 말함.)

                // pivot보다 j번째가 작으면 ++i번째와 스왑
                // i번째가 pivot을 기준으로 정렬된 개수를 의미
                String temp = A[++i];
                A[i] = A[j];
                A[j] = temp; // swapping.
            }
        }
        // 반복문이 끝나고 i번째와 pivot값을 바꾸면 pivot을 기준으로 작은 값은 왼쪽 큰 값은 오른쪽으로 정렬이 끝났다는 뜻.
        String temp = A[i + 1];
        A[i + 1] = A[last];
        A[last] = temp;
        return i + 1; // 기준 원소 위치로 리턴.
    }

    public void quickSort(String A[], int first, int last) {
        if (first < last) { // 원소가 2개 이상일 경우에만 정렬 작업 수행하도록 하는 조건문.
            int pivot = partition(A, first, last); // first, last기준으로 A배열 정렬.
            quickSort(A, first, pivot - 1); // 재귀 알고리즘으로 기준값 미만인 경우 왼쪽 부분 정렬.
            quickSort(A, pivot + 1, last); // 재귀 알고리즘으로 기준값 미만인 경우 왼쪽 부분 정렬.
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("");
        System.out.print("단어 수 입력: ");
        int num = sc.nextInt(); // 입력 받은 단어 수 num 변수에 저장.

        String wordArray[] = new String[num]; // num 크기의 배열 wordArray 선언.
        QuickSort Q = new QuickSort(); // QuickSort 타입의 변수 Q 선언. > quickSort 메소드를 불러오기 위함.

        System.out.print(num + "개의 단어 입력: ");
        for (int i = 0; i < wordArray.length; i++) {
            wordArray[i] = sc.next();
        }

        System.out.print("퀵 정렬 결과: ");
        // 퀵 정렬 시작.
        Q.quickSort(wordArray, 0, num - 1);
        for (int i = 0; i < wordArray.length; i++) {
            System.out.print(wordArray[i] + " ");
        }
    }
}

Tags