Skip to content

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป 7์›” 2์ผ ๊ณ ๊ธ‰ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

chaeun lee edited this page Jul 5, 2024 · 1 revision

Java๋ฅผ ์‚ฌ์šฉํ•ด์„œ Radix(๊ธฐ์ˆ˜), Quick, Merge(๋ณ‘ํ•ฉ)์ •๋ ฌ์„ ๊ณต๋ถ€ํ–ˆ๋‹ค.

1. Radix ์ •๋ ฌ

import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

        writer.write("์ •๋ ฌํ•  ์ˆ˜๋“ค์„ ์ž…๋ ฅํ•˜์„ธ์š”. >>> ");
        writer.flush();
        String[] input = reader.readLine().split(" ");

        int[] arr = new int[input.length];
        for (int i=0;i<input.length;i++)
            arr[i] = Integer.parseInt(input[i]);

        writer.write("์›๋ž˜ ๋ฐฐ์—ด: ");
        printfunc(writer,arr);

        radixSort(arr);

        writer.write("ํ€ต ์ •๋ ฌ ํ›„ ๋ฐฐ์—ด: ");
        printfunc(writer,arr);
    }

    public static void radixSort(int[] arr){
        int max = Arrays.stream(arr).max().getAsInt();
        for(int exp = 1; max / exp > 0; exp *= 10){
            countingSortByDigit(arr,exp);
        }
    }

    public static void countingSortByDigit(int[] arr, int exp) {
        int n = arr.length;
        int[] output = new int[n];
        int[] count = new int[10];
        Arrays.fill(count, 0);

        for (int i = 0; i < n; i++) {
            int digit = (arr[i] / exp) % 10;
            count[digit]++;
        }

        for (int i = 1; i < 10; i++) {
            count[i] += count[i - 1];
        }

        for (int i = n - 1; i >= 0; i--) {
            int digit = (arr[i] / exp) % 10;
            output[count[digit] - 1] = arr[i];
            count[digit]--;
        }

        System.arraycopy(output, 0, arr, 0, n);
    }


    public static void printfunc(BufferedWriter writer, int[] arr) throws IOException{
        for (int j : arr) writer.write(j+" ");
        writer.write("\n\n");
        writer.flush();
    }

}

2. Quick ์ •๋ ฌ

import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

        writer.write("์ •๋ ฌํ•  ์ˆ˜๋“ค์„ ์ž…๋ ฅํ•˜์„ธ์š”. >>> ");
        writer.flush();
        String[] input = reader.readLine().split(" ");

        int[] arr = new int[input.length];
        for (int i=0;i<input.length;i++)
            arr[i] = Integer.parseInt(input[i]);

        writer.write("์›๋ž˜ ๋ฐฐ์—ด: ");
        printfunc(writer,arr);

        quickSort(arr,0, arr.length-1);

        writer.write("ํ€ต ์ •๋ ฌ ํ›„ ๋ฐฐ์—ด: ");
        printfunc(writer,arr);
    }

    public static void quickSort(int[] arr, int p, int q){
        if (p<q){
            int pi = partition(arr,p,q);

            quickSort(arr,p,pi-1);
            quickSort(arr,pi+1,q);
        }
    }

    public static int partition(int[] arr, int p, int q){
        int pivot = arr[q];
        int i = p-1;

        for (int j = p; j<q;j++){
            if (arr[j] < pivot) {
                i++;
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }

        int temp = arr[i+1];
        arr[i+1] = arr[q];
        arr[q] = temp;

        return i+1;
    }

    public static void printfunc(BufferedWriter writer, int[] arr) throws IOException{
        for (int j : arr) writer.write(j+" ");
        writer.write("\n\n");
        writer.flush();
    }

}

3. Merge ์ •๋ ฌ

import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

        writer.write("์ •๋ ฌํ•  ์ˆ˜๋“ค์„ ์ž…๋ ฅํ•˜์„ธ์š”. >>> ");
        writer.flush();
        String[] input = reader.readLine().split(" ");

        int[] arr = new int[input.length];
        for (int i = 0; i < input.length; i++) {
            arr[i] = Integer.parseInt(input[i]);
        }

        writer.write("์›๋ž˜ ๋ฐฐ์—ด: ");
        printArray(writer, arr);

        mergeSort(arr, 0, arr.length - 1);

        writer.write("๋ณ‘ํ•ฉ ์ •๋ ฌ ํ›„ ๋ฐฐ์—ด: ");
        printArray(writer, arr);
    }

    public static void mergeSort(int[] arr, int left, int right) {
        if (left < right) {
            int mid = (left + right) / 2;

            mergeSort(arr, left, mid);
            mergeSort(arr, mid + 1, right);

            merge(arr, left, mid, right);
        }
    }

    public static void merge(int[] arr, int left, int mid, int right) {
        int n1 = mid - left + 1;
        int n2 = right - mid;

        int[] L = new int[n1];
        int[] R = new int[n2];

        for (int i = 0; i < n1; i++) {
            L[i] = arr[left + i];
        }
        for (int j = 0; j < n2; j++) {
            R[j] = arr[mid + 1 + j];
        }

        int i = 0, j = 0;
        int k = left;

        while (i < n1 && j < n2) {
            if (L[i] <= R[j]) {
                arr[k] = L[i];
                i++;
            } else {
                arr[k] = R[j];
                j++;
            }
            k++;
        }

        while (i < n1) {
            arr[k] = L[i];
            i++;
            k++;
        }

        while (j < n2) {
            arr[k] = R[j];
            j++;
            k++;
        }
    }

    public static void printArray(BufferedWriter writer, int[] arr) throws IOException {
        for (int j : arr) {
            writer.write(j + " ");
        }
        writer.write("\n\n");
        writer.flush();
    }
}
Clone this wiki locally