일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 운영체제
- global soop
- useReducer
- apple developer academy 후기
- Swift 기능
- OS
- 애플 디벨로퍼 아카데미 후기
- 숭실대
- 데이터베이스
- 치지직
- 애플 디벨로퍼 아카데미
- 데이터베이스 공부
- SWIFT
- iOS 개발 오류
- Apple Developer Academy @ POSTECH
- react
- 제앱소
- swift문법
- ObservableObject
- sqoop
- 소프트웨어분석및설계
- 네이버 치지직
- StateObject
- 앱 비교 프로젝트
- ObservedObject
- 네이버 부스트캠프
- Swift 문법
- 애플 디벨로퍼 아카데미 21주차 회고
- 애플 아카데미 후기
- Swift 디자인패턴
- Today
- Total
사과하는 제라스
기본 정렬 - Bubble Sort(버블 정렬) 본문
목차
[정렬 방법]
전체(n개의 값)에서 가장 왼쪽 이웃한 두 값부터 오른쪽 끝까지 비교하는데 왼>오이면 swap, 아닐 경우 continue한다. 이후 가장 max값을 픽스하고 나머지 값에 대해 이 과정을 진행,... 마지막으로 남은 두 값을 비교하고서 정렬하면 정렬이 완료된다.
[정렬 과정]
n 크기의 임의의 배열 arr에서(이때, 코드에서 key는 min과 max로 작성하였음.)
<1단계> - n-1번의 비교
arr[0]과 arr[1]을 비교 후 ( arr[0] > arr[1] )이면 arr[0]과 arr[1] swap, ( arr[0] <= arr[1] )이면 continue
arr[1]과 arr[2]을 비교 후 ( arr[1] > arr[2] )이면 arr[1]과 arr[2] swap, ( arr[1] <= arr[2] )이면 continue
.
.
.
arr[n-2]과 arr[n-1]을 비교 후 ( arr[n-2] > arr[n-1] )이면 arr[n-2]과 arr[n-1] swap, ( arr[n-2] <= arr[n-1] )이면 continue
<2단계> - n-2번의 비교
arr[0]과 arr[1]을 비교 후 ( arr[0] > arr[1] )이면 arr[0]과 arr[1] swap, ( arr[0] <= arr[1] )이면 continue
arr[1]과 arr[2]을 비교 후 ( arr[1] > arr[2] )이면 arr[1]과 arr[2] swap, ( arr[1] <= arr[2] )이면 continue
.
.
.
arr[n-3]과 arr[n-2]을 비교 후 ( arr[n-3] > arr[n-2] )이면 arr[n-3]과 arr[n-2] swap, ( arr[n-3] <= arr[n-2] )이면 continue
<n-1단계> - 1번의 비교
arr[0]과 arr[1]을 비교 후 ( arr[0] > arr[1] )이면 arr[0]과 arr[1] swap, ( arr[0] <= arr[1] )이면 continue
[pseudo code]
bubbleSort(arr[], n) {
for last <- n downto 2 {
for i <- 0 to last-1
if (arr[i] > arr[i+1]) the arr[i] <-> arr[i+1]; //arr[i] > arr[i+1]이면 두 값 swap
}
}
[코드 구현]
public class Bubble {
public static int[] input = {22, 5, 34, 1, 32, 18, 2, 8}; //예시로 작성한 배열
public static void main(String[] args) {
bubbleSortMax(input, input.length); //혹은 bubbleSortMin(input, input.length);
for (int i : input) {
System.out.print(i + " ");
}
}
public static void bubbleSortMax(int[] input, int length) { //가장 큰 값부터 버블 정렬하는 방법
int tmp;
for (int i = length-1; i > 0; i--) //0부터 length-1, 0부터 length-2,...,0과 1까지 비교해나감.
for (int j = 0; j < i; j++) { //0과1, 1과2,...,i-2와 i-1을 비교 후 큰 값을 오른쪽으로 바꿔나감.
if (input[j] > input[j+1]) {
tmp = input[j];
input[j] = input[j+1];
input[j+1] = tmp;
}
}
}
public static void bubbleSortMin(int[] input, int length) { //가장 작은 값부터 버블 정렬하는 방법
int tmp;
for (int i = 0; i < length-1; i++) //0부터 length-1, 0부터 length-2,...,0과 1까지 비교해나감.
for (int j = length-1; j > i; j--) { //i과 i+1, i+1과 i+2,...,length-2 length-1을 비교 후 큰 값을 오른쪽으로 바꿔나감.
if (input[j] < input[j-1]) {
tmp = input[j];
input[j] = input[j-1];
input[j-1] = tmp;
}
}
}
}
[시간 복잡도]
처음에 n-1번의 비교, 그 다음에 n-2번의 비교,..., 1번의 비교를 진행하므로
T(n) = (n-1)+(n-2)+...+1 ) = O( n(n-1)/2 ) = O(n^2) 이 된다.
정렬이 잘 되어 있는 정도에 따라서
최악, 최선, 평균 모두 n(n-1)/2번의 비교연산을 수행하므로 시간복잡도는 모두 O(n^2)이다.
'알고리즘 학습 페이지' 카테고리의 다른 글
합병 정렬(Merge Sort) (0) | 2021.11.26 |
---|---|
유클리드 호제법(Euclidean Algorithm) (0) | 2021.11.26 |
기본 정렬 - Insertion sort(삽입 정렬) (0) | 2021.11.21 |
기본 정렬 - Selection sort(선택 정렬) (0) | 2021.11.20 |
에라토스테네스의 체 (0) | 2021.10.24 |