private static void process() {
for (int changeIndex = 0; changeIndex < values.length; changeIndex++) {
int minimumNumberIndex = changeIndex;
// changeIndex 다음부터 끝까지 수 중 가장 작은 수 찾기
for (int findMinimum = changeIndex + 1; findMinimum < values.length; findMinimum++) {
if (values[minimumNumberIndex] > values[findMinimum]) {
minimumNumberIndex = findMinimum;
}
}
// values[changeIndex] <-> values[minimumNumberIndex]
int temp = values[changeIndex];
values[changeIndex] = values[minimumNumberIndex];
values[minimumNumberIndex] = temp;
}
for (int i = 0; i < values.length; i++) {
System.out.print(values[i] + " ");
}
}
private static void process() {
// 가장 첫번째 인덱스는 정렬되어있다고 생각하고 두번째 인덱스부터 정렬 시작
for (int i = 1; i < values.length; i++) {
for (int j = i; j > 0; j--) {
if (values[j] < values[j - 1]) {
int temp = values[j];
values[j] = values[j - 1];
values[j - 1] = temp;
} else {
break; // 정렬하려는 숫자보다 작은 숫자를 만나게되면 그 왼쪽은 더 이상 볼 필요가 없으므로 break
}
}
}
for (int i = 0; i < values.length; i++) {
System.out.print(values[i] + " ");
}
}
가장 많이 사용되는 정렬 알고리즘
동작 과정
리스트의 첫 번째 데이터를 기준 숫자(pivot)로 정함 → 호어 분할 (Hoare Partition)
왼쪽에서부터 pivot보다 큰 수를 찾아서 선택 (a)
오른쪽에서부터 pivot보다 작은 수를 찾아서 선택 (b)
4-1. a가 b보다 왼쪽에 있는 경우

4-2. a가 b보다 오른쪽에 있는 경우


시간 복잡도 : O(NlogN) → 선택 정렬, 삽입 정렬보다 빠름
private static void quickSort(int start, int end) {
int pivot = start;
int left = start + 1;
int right = end;
// 원소가 1개인 경우 종료
if (start >= end) {
return;
}
while (left <= right) {
// 왼쪽에서부터 피벗보다 큰 숫자 찾기
while (left <= end && values[left] <= values[pivot]) {
left++;
}
// 오른쪽에서부터 피벗보다 작은 숫자 찾기
while (right > start && values[right] >= values[pivot]) {
right--;
}
// left, right 가 엇갈리지 않았다면 둘을 교체
if (left <= right) {
int temp = values[left];
values[left] = values[right];
values[right] = temp;
} else { // left, right 가 엇갈렸다면 pivot 과 values[right] (작은 수)를 교체
int temp = values[pivot];
values[pivot] = values[right];
values[right] = temp;
}
}
// pivot 기준으로 왼쪽, 오른쪽 리스트에 대해 다시 퀵 정렬
quickSort(start, right - 1);
quickSort(right + 1, end);
}
private static void process() {
quickSort(0, values.length - 1);
for (int i = 0; i < values.length; i++) {
System.out.print(values[i] + " ");
}
}
(최대값 + 1)에 해당하는 배열을 만듦
ex) 1, 1, 3, 5, 7 → new int[8]
리스트 내 해당 숫자를 인덱스로 하는 배열의 값을 증가시켜 숫자의 갯수를 셈
작은 수부터 갯수만큼 배열의 인덱스 출력
private static void process() {
int maxValue = Arrays.stream(values).max().getAsInt();
int[] countCoefficient = new int[maxValue + 1];
for (int number : values) {
countCoefficient[number]++;
}
for (int i = 0; i <= maxValue; i++) {
for (int j = 0; j < countCoefficient[i]; j++) {
System.out.print(i + " ");
}
}
}
Comparable 인터페이스를 구현한 클래스(Element) 정의compareTo 메소드 오버라이딩배열에 값을 입력받음Arrays.sort(배열) static class Element implements Comparable<Element> {
int score;
@Override
public int compareTo(Element other) { //정렬의 기준이 되는 메소드
return this.score - other.score;
}
}
public static void process() {
Arrays.sort(Students); //오버라이딩 한 compareTo 메소드를 기준으로 정의
}