Study for Backend/Algorithm
[Algorithm기초] 버블 정렬, 삽입 정렬, 선택 정렬
지미니박
2024. 2. 19. 21:00
정렬
특정 값을 기준으로 데이터를 순서대로 배치하는 방법
정렬의 종류
1. 구현 난이도는 쉽지만 속도는 느린 알고리즘 - 버블 정렬, 삽입 정렬, 선택 정렬
2. 구현 난이도는 조금 더 어렵지만, 속도는 빠른 알고리즘 - 합병 정렬, 힙 정렬, 퀵 정렬, 트리 정렬
3. 하이브리드 정렬 - 팀 정렬, 블록 병합 정렬, 인트로 정렬
4. 기타 정렬 알고리즘 - 기수 정렬, 카운팅 정렬, 셸 정렬, 보고 정렬
버블 정렬 (Bubble Sort)
인접한 데이터를 비교하며 자리를 바꾸는 방식. 값을 비교하고 작은 수가 앞쪽으로 자리교체
알고리즘 복잡도 : O(n제곱) = n(n-1)/2
버블정렬구현 의사코드 (Pseudocode) *스도코드 : 알고리즘 flow 파악용 코드이며 실제 돌아가지 않음
bubbleSort(arr[]){
arr[SIZE]
for i = 1 to SIZE - 1 {
for j = 0 to SIZE - i {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j+1])
}
}
}
}
삽입 정렬(Insertion Sort)
앞의 데이터를 정렬 해가면서 삽입 위치를 찾아 정렬하는 방식, 버블정렬보다 빠름
알고리즘 복잡도 : O(n제곱) = n(n-1)/2
삽입정렬구현 의사코드 (Pseudocode)
insertionSort(arr[]){
arr[SIZE]
for i = 1 to SIZE {
for j = i to 0 (j--) {
if (arr[j] < arr[j - 1]) { //정렬되어있어도 비교가 되기 때문에 필요하면 break를 추가하면 좋음
swap(arr[j], arr[j - 1])
}
}
}
}
선택 정렬(Selection Sort)
최소 또는 최대값을 찾아서 가장 앞 또는 뒤부터 정렬하는 방식, 배열 안에서 정렬이 일어나서 제자리 정렬이라고도 함.
메모리를 최소한으로 사용함.
알고리즘 복잡도 : O(n제곱) = n(n-1)/2
선택정렬구현 의사코드 (Pseudocode)
selectionSort(arr[]){
arr[SIZE]
for i = 0 to SIZE - 1 {
min = i
for j = i + 1 to SIZE {
if (arr[j] < arr[min]) {
min = j
}
}
swap(arr[i], arr[min])
}
}
연습
public class algorithm01 {
public static void bubbleSort(int[] arr){
for (int i = 1; i < arr.length - 1 ; i++) { //case1 처음부터 시작
//for (int i = arr.length - 1; i > 0 ; i--) { //case2 끝부터 시작
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]){
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
public static void insertionSort(int[] arr){
for (int i = 1; i < arr.length ; i++) {
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j - 1]){
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
}else {
break;
}
}
}
}
public static void selectionSort(int[] arr){
for (int i = 0; i < arr.length - 1 ; i++) {
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]){
min = i;
}
}
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
/* for (int i = arr.length - 1; i > 0 ; i--) { //뒤에서 부터 비교
int max = i;
for (int j = i - 1; j >= 0; j--) {
if (arr[j] > arr[max]){
max = i;
}
}
int tmp = arr[i];
arr[i] = arr[max];
arr[max] = tmp;
}*/
}
public static void main(String[] args) {
//Test code
int[] arr = {3, 5, 2, 7, 1, 4};
bubbleSort(arr);
System.out.println("버블 정렬 : " + Arrays.toString(arr));
arr = new int[]{3, 5, 2, 7, 1, 4};
insertionSort(arr);
System.out.println("삽입 정렬 : " + Arrays.toString(arr));
arr = new int[]{3, 5, 2, 7, 1, 4};
selectionSort(arr);
System.out.println("선택 정렬 : " + Arrays.toString(arr));
}
}
알고리즘개념 참고 link
https://velog.io/@okko8522/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B0%9C%EB%85%90
알고리즘 시작: 개념, 마인드
알고리즘 개념, 복잡도
velog.io