์ ๋ ฌ์ด๋ ๋ฐ์ดํฐ๋ฅผ ํน์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ์ ์์๋๋ก ๋์ดํ๋ ๊ฒ์ ๋งํ๋ค. ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ฉด ์ด์ง ํ์์ด ๊ฐ๋ฅํ๋ค.
๊ฐ์ฅ ์์ ๊ฒ์ ์ ํํด์ ์์ผ๋ก ๋ณด๋ด๋ ๊ณผ์ ์ ๋ฐ๋ณตํด์ ์ํํ๋ฉด, ์ ์ฒด ๋ฐ์ดํฐ์ ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋ค.
import java.util.*;
public class Main {
public static void main(String[] args) {
int n = 3;
int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
for (int i = 0; i < n; i++) {
int min_index = i; // ๊ฐ์ฅ ์์ ์์์ ์ธ๋ฑ์ค
for (int j = i + 1; j < n; < j++) {
if (arr[min_index] > arr[j]) min_index = j;
}
}
// ์ค์ํ
int temp = arr[i];
arr[i] = arr[min_index];
arr[min_index] = temp;
}
for (int i = 0; i < n; i ++) System.out.print(arr[i] + " ");
}
import java.util.*;
public class Main {
public static void main(String[] args) {
int[] arr = {3, 5};
// ์ค์ํ(Swap)
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
System.out.println(arr[0] + " " + arr[1]);
}
}
์ ํ ์ ๋ ฌ์ ์์์๋ถํฐ ํ ์์๋ฅผ ๊ฐ์ง๊ณ ๋ฐ๋ณต์ ์ผ๋ก ์ญ ํ์์ ํ๊ธฐ ๋๋ฌธ์ O(N^2)์ด๋ค
์ฝ์ ์ ๋ ฌ์ ํน์ ํ ๋ฐ์ดํฐ๊ฐ ์ ์ ํ ์์น์ ๋ค์ด๊ฐ๊ธฐ ์ด์ ์, ๊ทธ ์๊น์ง์ ๋ฐ์ดํฐ๋ ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์์น์ ์ฝ์ ํ๋ค.
import java.util.*;
public class Main {
public static void main(String[] args) {
int n = 10;
int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
for (int i = 1; i < n; i++) {
// ์ธ๋ฑ์ค i๋ถํฐ 1๊น์ง ๊ฐ์ํ๋ฉฐ ๋ฐ๋ณตํ๋ ๋ฌธ๋ฒ
for (int j = i; j > 0; j--) {
// ํ์นธ์ฉ ์์ผ๋ก ์ด๋
if (arr[j] < arr[j - 1]) {
// ์ค์ํ
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
// ์๊ธฐ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ฉด ๊ทธ ์์น์์ ๋ฉ์ถค
else break;
}
}
for(int i = 0; i < n; i++) System.out.print(arr[i] + " ");
}
์ฝ์ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(N^2)์ ๋๋ค.
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ณ ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๊ตํํ๊ณ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ผ๋ก ๋๋๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
import java.util.*;
public class Main {
// ๋ค์๊ณผ ๊ฐ์ ์ธ์๋ค์ด ํ์ํฉ๋๋ค.
public static void quickSort(int[] arr, int start, int end) {
if (start >= end) return; // ์ฌ๊ทํจ์์ ์ข
๋ฃ ์กฐ๊ฑด=์์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ(start, end ๊ฐ์ ๋)
int pivot = start;// ํผ๋ฒ์ ์ฒซ ๋ฒ์งธ ์์
int left = start + 1;
int right = end;
while (left <= right) { // ์ค๋ฅธ์ชฝ์ด ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ณ์ ์งํ
// ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต(์ ํํ์)
while (left <= end && arr[left] <= arr[pivot]) left++;
// ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต(์ ํํ์)
while (right > start && arr[right] > arr[pivot]) right--;
// ์๊ฐ๋ ธ๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ์ ๊ต์ฒด
if (left > right) {
int temp = arr[pivot];
arr[pivot] = arr[right];
arr[right] = temp;
}
// ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๊ต์ฒด
else {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
// ๋ถํ ์ดํ ์ผ์ชฝ ๋ถ๋ถ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์์ ๊ฐ๊ฐ ์ ๋ ฌ ์ํ(์ฌ๊ท ํธ์ถ)
quickSort(arr, start, right - 1); // ์ผ์ชฝ
quickSort(arr, right + 1, end); // ์ค๋ฅธ์ชฝ
}
public static void main(String[] args) {
int n = 10;
int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
quickSort(arr, 0, n - 1); // ์ฒซ๋ฒ์งธ ์์๋ pivot์ด๊ธฐ ๋๋ฌธ์ n - 1
for(int i = 0; i < n; i++) {
System.out.print(arr[i] + " ");
}
}
}
ํต ์ ๋ ฌ์ ์ฌ๊ท ํจ์ ํํ๋ก ์์ฑํ์ ๋ ๊ตฌํ์ด ๋งค์ฐ ๊ฐ๊ฒฐํด์ง๋๋ค.
ํ์ฌ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 1๊ฐ์ผ ๊ฒฝ์ฐ, ๋ถํ ์ด ๋ถ๊ฐ๋ฅํจ์ผ๋ก ์ฌ๊ทํธ์ถ์ด ์ข ๋ฃ๋์ผ ํฉ๋๋ค.
ํ๊ท ์ Nlog(N), ์ต์ (์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด ์๋ ๊ฒฝ์ฐ) O(N^2) ์ด ๊ฒฝ์ฐ๋ ์ฝ์ ์ ๋ ฌ์ ์ฌ์ฉํ์
ํน์ ํ ์กฐ๊ฑด์ด ๋ถํฉํ ๋๋ง ์ฌ์ฉํ ์ ์์ง๋ง ๋งค์ฐ ๋น ๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๋ฐ์ดํฐ N๊ฐ ์ค ์ต๋๊ฐ์ด K์ผ ๋ ์ต์ ์ ๊ฒฝ์ฐ์๋ O(N + K)๋ฅผ ๋ณด์ฅํฉ๋๋ค.
import java.util.*;
public class Main {
public static final int MAX_VALUE = 9; // ๋ฐฐ์ด์ ์ํ ๊ณ ์ ๊ฐ ์ธํ
public static void main(String[] args) {
int n = 15;
// ๋ชจ๋ ์์์ ๊ฐ์ด 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๊ณ ๊ฐ์
int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2};
// ๋ชจ๋ ๋ฒ์๋ฅผ ํฌํจํ๋ ๋ฐฐ์ด ์ ์ธ(๋ชจ๋ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ)
int[] count = new int[MAX_VALUE + 1];
for (int i = 0; i < n; i++) count[arr[i]] += 1;
for (int i = 0; i <= MAX_VALUE; i++) {
// ๋์ด์ฐ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฑ์ฅํ ํ์๋งํผ ์ธ๋ฑ์ค ์ถ๋ ฅ
for (int j = 0; j < count[i]; j++) System.out.print(i + " ");
}
}
}
๊ฐ์ฅ ์์ ๋ฐ์ดํฐ์ ํฐ ๋ฐ์ดํฐ์ ๋ฒ์๋ฅผ ๋ชจ๋ ๊ฐ๊ธธ ์ ์๋๋ก ํ๋์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ , ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉด์ ๋ฐ์ดํฐ์ ๊ฐ๊ณผ ๋์ผํ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ 1์ฉ ์ฆ๊ฐ์ํค๋ฉด ๋ฉ๋๋ค.
๋ชจ๋ ๋ฐ์ดํฐ์ ๋ฒ์๋ฅผ ๋ด์์ผํ๋ ๋ฆฌ์คํธ๋ฅผ ์ ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ์ดํฐ N๊ฐ, ๋ฐ์ดํฐ ์ค ์ต๋๊ฐ K๋ฉด O(N +K)๊ฐ ๋ฉ๋๋ค.
๊ณ์์ ๋ ฌ์ ๋์ผํ ๊ฐ์ ๊ฐ์ง๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๊ฐ ๋ฑ์ฅํ ๋ ์ ํฉํ๋ค.
๋จ์ ์ ๋ง์ฝ ๋ฐ์ดํฐ๊ฐ 0, 9999 ๋จ 2๊ฐ์ผ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. 10000๊ฐ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ผ ํ๋ค. ๋นํจ์จ์ ์ด๋ค.
import java.util.*;
public class Main {
public static void main(String[] args) {
int n = 10;
int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
Arrays.sort(arr);
for(int i = 0; i < n; i++) {
System.out.print(arr[i] + " ");
}
}
}
import java.util.*;
class Fruit implements Comparable<Fruit> {
private String name;
private int score;
public Fruit(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return this.name;
}
public int getScore() {
return this.score;
}
// ์ ๋ ฌ ๊ธฐ์ค์ '์ ์๊ฐ ๋ฎ์ ์์'
@Override
public int compareTo(Fruit other) {
if (this.score < other.score) return -1; // ์ญ์์ผ๋ก ์ ๋ ฌ
return 1;
}
}
public class Main {
public static void main(String[] args) {
List<Fruit> fruits = new ArrayList<>();
fruits.add(new Fruit("๋ฐ๋๋", 2));
fruits.add(new Fruit("์ฌ๊ณผ", 5));
fruits.add(new Fruit("๋น๊ทผ", 3));
Collections.sort(fruits);
for (int i = 0; i < fruits.size(); i++) {
System.out.print("(" + fruits.get(i).getName() + "," + fruits.get(i).getScore() + ") ");
}
}
}
์ฐธ์กฐ
https://velog.io/@dongchyeon/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%84%A0%ED%83%9D-%EC%A0%95%EB%A0%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
.
https://devjin-blog.com/sort-algorithm-3/
.
https://gmlwjd9405.github.io/2018/05/10/algorithm-quick-sort.html
.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=k_blomkv&logNo=221137056088