티스토리 뷰
C언어 정렬 - 버블정렬(Bubble Sort) 쉽게 정리하기
버블 정렬(Bubble Sort)은 시간 복잡도가 O(n^2)로 상당히 느리지만, 코드가 단순하기 때문에 자주 사용되는데요. 원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 지어진 이름이라고 하네요.
버블 정렬(Bubble Sort)
- 두 인접한 원소를 검사하여 정렬하는 방법
- 시간 복잡도 O(n^2)
- 코드가 단순하기 때문에 자주 사용됨
버블 정렬 알고리즘 실행 과정 해부하기
버블 정렬 알고리즘의 실행 과정을 보도록 하겠습니다.
이 버블 정렬 알고리즘은 인접한 두 수를 비교해서 큰 수를 뒤로 보내는 알고리즘이라고 위에서 설명한 바 있는데요. 이번에는 실제 예제를 통해서 그 과정을 눈으로 확인해 보도록 하겠습니다.
예를 들어 아래와 같이 다섯 개의 숫자가 있다고 가정하고 과정을 설명하도록 하겠습니다.
6 |
4 |
7 |
9 |
1 |
에서 먼저 6, 4를 비교하여 6이 더 큰 수이므로.. 두 수의 자리를 교체합니다.
6 |
4 |
7 |
9 |
1 |
4 |
6 |
7 |
9 |
1 |
다시 오른쪽으로 한칸 이동해서 6, 7을 비교합니다. 여기서는 7이 크므로 교환이 없습니다.
4 |
6 |
7 |
9 |
1 |
다시 오른쪽으로 한칸 이동해서 7, 9를 비교합니다. 여기서는 9이 크므로 교환이 없습니다.
4 |
6 |
7 |
9 |
1 |
다시 오른쪽으로 한칸 이동해서 9, 1를 비교합니다. 여기서는 9가 크므로 두수를 교환합니다.
4 |
6 |
7 |
9 |
1 |
4 |
6 |
7 |
1 |
9 |
다시 맨 처음으로 돌아와서 4, 6을 비교합니다. 6이 크므로 다음으로 진행합니다.
4 |
6 |
7 |
1 |
9 |
다시 오른쪽으로 한칸 이동해서 6, 7을 비교합니다. 7이 크므로 다음으로 진행합니다.
4 |
6 |
7 |
1 |
9 |
4 |
6 |
7 |
1 |
9 |
다시 오른쪽으로 한 칸 이동해서 7, 1을 비교합니다. 7이 크므로 두 수를 교환합니다.
4 |
1 |
7 |
1 |
9 |
4 | 1 | 1 | 7 | 9 |
다시 오른쪽으로 한 칸 이동해서 7, 9를 비교합니다. 9가 크므로 다음으로 진행합니다.
4 |
1 |
6 |
7 |
9 |
다시 처음으로 가서 4, 1을 비교합니다. 4가 크므로 두 수를 교환합니다.
4 |
1 |
6 |
7 |
9 |
1 |
4 |
6 |
7 |
9 |
나머지도 인접한 두 수를 비교하면서 진행합니다...
정렬이 다 되었으니 나머지 과정은 생략합니다.
잘 보셨나요? 위의 과정과 같이 버블 정렬이 진행됩니다.
버블 정렬(Bubble Sort) 알고리즘 분석
버블 정렬(Bubble Sort)의 알고리즘을 분석해보도록 하겠습니다.
먼저 메모리 사용 공간을 보면 아래와 같이 n개의 원소를 저장하므로 n개의 메모리를 사용하게 됩니다.
6 |
4 |
7 |
9 |
1 |
최선의 경우는 자료가 이미 정렬되어 있는 경우입니다. 아래와 같이 정렬되어 있는 경우, 비교횟수는 i번째 원소를 (n-1)번 비교하므로 n(n-1)/2번이고 자리교환이 발생하지 않으므로 자리교환횟수는 0번입니다.
1 |
4 |
6 |
7 |
9 |
최악의 경우는 자료가 역순으로 정렬되어 있는 경우입니다.
이 경우 비교횟수는 i번째 원소를 (n-1)번 비교하므로, n(n-1)/2번이고 자리교환횟수는 i번째 원소를 (n-1)번 교환하므로 n(n-1)/2번이 됩니다.
9 |
7 |
6 |
4 |
1 |
버블 정렬 알고리즘 분석
* 메모리 사용 공간
n개의 원소에 대하여 n개의 메모리 사용
* 연산 시간
- 최선의 경우 : 자료가 이미 정렬되어 있는 경우
:: 비교횟수 : i번째 원소를 (n-1)번 비교하므로, n(n-1)/2번
:: 자리교환횟수 : 자리교환이 발생하지 않음
- 최악의 경우 : 자료가 역순으로 정렬되어 있는 경우
:: 비교횟수 : i번째 원소를 (n-1)번 비교하므로 n(n-1)/2번
:: 자리교환횟수 : i번째 원소를 (n-1)번 교환하므로 n(n-1)/2번
평균 시간 복잡도는 O(n^2)이 됨
버블 정렬(Bubble Sort) 알고리즘 소스
버블 정렬(Bubble Sort) 알고리즘 소스를 보도록 하겠습니다.
#include<stdio.h> int main() { int arr[5]={6,4,7,9,1}; int i,j,tmp; // 정렬 전 배열값 출력 printf("===== 버블정렬 전 =====\n"); for(i=0;i<5;i++) printf("%3d",arr[i]); printf("\n"); // 버블정렬 for(i=0;i<5;i++) { for(j=0;j<4;j++) { // 앞의 수, 바로 뒤의 수 비교해서 // 앞의 수가 클 경우 값을 교환 if(arr[j]>arr[j+1]) { tmp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=tmp; } } } // 버블 정렬 결과 출력 printf("===== 버블정렬 후 =====\n"); for(i=0;i<5;i++) printf("%3d",arr[i]); printf("\n"); return 0; }
위의 소스를 실행한 결과입니다.
위 소스의 핵심소스는 아래 부분이 되겠습니다.
// 버블정렬 for(i=0;i<5;i++) { for(j=0;j<4;j++) { // 앞의 수, 바로 뒤의 수 비교해서 // 앞의 수가 클 경우 값을 교환 if(arr[j]>arr[j+1]) { tmp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=tmp; } } }
궁금하신 것이 있으시면 댓글 남겨주세요^^
'IT 이야기 > 프로그래밍' 카테고리의 다른 글
[HTML5 강의] 3. HTML5 기본 태그, 시멘틱(semantic) 태그 (2) | 2013.11.21 |
---|---|
[HTML5 강의] 2.1 HTML5의 기본 (0) | 2013.11.21 |
[HTML5 강의] 2. HTML5 실행해보자. 웹 브라우저 설치하기 (0) | 2013.11.21 |
[한방에 이해하는 C언어] 입력을 받자 scanf 함수 (0) | 2013.11.11 |
[Javascript] 즐겨찾기 소스 (5) | 2013.11.09 |
[C언어 강좌] 함수 fprintf()와 fscanf()의 개념부터 예제 소스까지 모든 것 총망라! (1) | 2013.10.31 |
[C언어 문제] 달력 날짜 구하기 (0) | 2013.10.25 |
[프로그래밍 문제] 줄어드는 면적 구하기 (0) | 2013.10.25 |
[프로그래밍 문제] 세균 수 구하기 문제 (0) | 2013.10.25 |
[PHP] commit, rollback 예제 (0) | 2013.10.14 |
- Total
- Today
- Yesterday
- W3Schools Online Web Tutorials
- 구차니의 잡동사니 모음
- [IT]블로거팁닷컴
- 비앤아이님의 블로그
- Blog Suspect
- 즐거운하루 blog
- zinicap의 검색엔진 마케팅(SEM)
- 머니야머니야님의 블로그
- [Friend] AtinStory
- [기타배우기]해브원 박스
- [웹표준] SINDB.com
- 해커 C 이야기
- [애드센스] 길라잡이
- 정순봉의 IT SCHOOL
- 씨디맨의 컴퓨터이야기
- 2proo Life Story
- 못된준코의 세상리뷰
- [IT강좌] 정보문화사
- IN 대전
- 에우르트는 나쁜남자 -_-
- 씬의 싱크탱크
- 엔돌슨의 IT이야기
- 진이늘이
- 'Cooltime'의 블로그
- 후이의 Tistory
- Soulstorage
- 앤드&엔드의 블로그
- June Blog
- 노지의 소박한 이야기
- gbWorld
- 인터넷 속 나의 생각
- HarshNix
- ART of WEB
- 녹두장군 - 상상을 현실로
- php
- It
- MBTI 검사
- 소스코드
- 강좌
- MBTI
- 안드로이드 어플 추천
- HTML
- 소스
- C
- 성공
- MBTI 강좌
- C언어 소스
- C언어
- MBTI 테스트
- 예제 소스
- 효과음
- JavaScript
- 프로그래밍
- 안드로이드 어플
- 안드로이드
- 강의
- 인터넷
- 인터넷 익스플로러
- 스마트폰
- C언어 문제
- 리뷰
- 프로그래밍 문제
- MBTI 자료
- 모토로이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |