티스토리 뷰
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> #define ARRAY_SIZE 10 int main() { int size = ARRAY_SIZE; int arr[ARRAY_SIZE] = { 3, 0, 1, 8, 7, 2, 5, 4, 9, 6 }; return 0; } | cs |
배열의 크기를 10으로 잡고, 그 안에 동영상에 나온 순서대로 숫자를 넣어 초기화 했습니다. 특이점은 없습니다. #define 매크로상수에 대해서는 알고 오셨으리라 생각하고, 설명을 생략하겠습니다. 이는 별도의 포스팅에서 다루어 보도록 하겠습니다.
3 |
0 |
1 |
8 |
7 |
2 |
5 |
4 |
9 |
6 |
최초 정의된 배열의 상태는 위와 같습니다. 이제 삽입 정렬을 통해서 순서대로 정렬해볼 텐데요.
영상을 보고 느끼셨을지 모르겠지만, 배열은 크게 두가지 영역으로 나눌 수 있습니다. 하나는 이미 정렬된 영역, 하나는 아직 정렬되지 않은 영역.
그럼 최초 정의된 배열에서 정렬된 부분은 어디일까요?
3 | 0 | 1 | 8 | 7 | 2 | 5 | 4 | 9 | 6 |
바로 가장 첫번째 방 입니다. 첫번째 방을 제외하고는 아무것도 정렬되지 않은 상태라고 생각하면 됩니다. 첫번째 방에서부터 한칸씩 옆으로 가면서 정렬하면 됩니다. 쭉쭉 달려보겠습니다.
0 | 3 | 1 | 8 | 7 | 2 | 5 | 4 | 9 | 6 |
첫번째 방과 두번째 방을 비교하여 서로 자리를 바꾼 상태
0 | 1 | 3 | 8 | 7 | 2 | 5 | 4 | 9 | 6 |
두번째 방과 세번째 방을 비교하여 자리를 바꾼 상태
0 | 1 | 3 | 8 | 7 | 2 | 5 | 4 | 9 | 6 |
세번째 방과 네번째 방을 비교했지만 이상이 없어서 그대로 둔 상태, 이렇게 정렬된 영역을 하나씩 늘려갑니다.
0 | 1 | 3 | 7 | 8 | 2 | 5 | 4 | 9 | 6 |
마찬가지로 7과 8을 비교하여 자리를 바꾸었죠. 어떤 느낌인지 감을 잡으셨으리라 생각합니다. 뒤에있는 2는 어떻게 비교할까요? 우선 8과 비교하여 두개의 자리를 바꾸고, 다시 7과 비교하여 자리를 바꾸고, 3과비교하여 자리를 바꾼 후 1과 비교한 뒤 자리를 잡게됩니다. 이제 이를 코드로 표현해보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | void insertion(int *p, int size) { int i, save = p[size - 1]; for (i = size - 2; i >= 0; i--) { if (p[i] <= save) break; p[i + 1] = p[i]; } p[i + 1] = save; } | cs |
1 2 | for (int i = 2; i <= size; i++) insertion(arr, i); | cs |
0 | 1 | 3 | 7 | 8 | 2 | 5 | 4 | 9 | 6 |
여기서 insertion을 위의 코드와 같이 실행하면, save는 2가 되겠죠. 그 상태에서 2보다 작거나 같은 숫자를 찾을때까지 루프를 돌며 한칸씩 옆으로 밀어버립니다.
0 | 1 | 3 | 7 | 8 | 5 | 4 | 9 | 6 |
이렇게 말이죠. 그리고 이렇게 한칸씩 밀린 상태에서 save라는 임시변수에 저장되어있던 2를 빈 자리에 삽입합니다. 이것이 삽입정렬이라는 이름의 이유입니다. 빈칸을 찾아 한개씩 삽입한다는 뜻입니다.
코드의 흐름에 따라 정렬이 진행되는 모습을 살펴보려고 했는데 적다보니 불필요하게 설명이 길게되어 글이 어수선합니다. 잘 이해가 안되는 부분은 질문 해주시면 되겠고요, 지적도 달게 받겠습니다. 추천이나 댓글은 큰 힘이 됩니다. 정렬(Sort) : 삽입정렬(Insertion Sort) 편을 마치겠습니다. 내일은 선택정렬(Selection Sort)에 대해서 다루어 보겠습니다. 감사합니다.
아래는 최종 코드입니다.
버전1.
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 32 33 34 35 36 37 38 39 | #include <stdio.h> #include <stdlib.h> #define ARRAY_SIZE 10 void insertion(int *p, int size); int main() { int size = ARRAY_SIZE; int arr[ARRAY_SIZE] = { 3, 0, 1, 8, 7, 2, 5, 4, 9, 6 }; //for (int i = 0; i < size; i++) // arr[i] = rand() % size+10; //배열을 랜덤한값으로 초기화 시켜준다. for (int i = 2; i <= size; i++) insertion(arr, i); for (int i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); return 0; } void insertion(int *p, int size) { int i, save = p[size - 1]; for (i = size - 2; i >= 0; i--) { if (p[i] <= save) break; p[i + 1] = p[i]; } p[i + 1] = save; } | cs |
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 32 33 34 35 36 37 | #include <stdio.h> #include <stdlib.h> #define ARRAY_SIZE 10 void insertNextItem(int a[], int i); void insertionSort(int a[], int n); int main() { int size = ARRAY_SIZE; int arr[10]; for (int i = 0; i < size; i++) arr[i] = rand() % size + 10; insertionSort(arr, size); for (int i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); return 0; } void insertionSort(int arr[], int size) { for (int i = 1; i < size; i++) insertNextItem(arr, i); } void insertNextItem(int arr[], int i) { int newItem(arr[i]), insertPos(i); for (; insertPos && newItem < arr[insertPos - 1]; insertPos--) arr[insertPos] = arr[insertPos - 1]; arr[insertPos] = newItem; } | cs |
'C,C++' 카테고리의 다른 글
자료구조 : 선형검색(Linear Search)와 이진 검색(Binary Search) (11) | 2016.03.17 |
---|---|
정렬(Sort) : 선택정렬(Selection Sort) (0) | 2016.03.11 |
데이터 캡슐화, 하이딩, 은닉기법 (0) | 2016.03.10 |
추상 자료형(ADT)란 무엇인가? (0) | 2016.03.09 |
C++ : Critical Section [임계영역] (0) | 2015.06.25 |
- Total
- Today
- Yesterday
- 자료구조
- 파이썬예제
- 파이썬
- socket
- C
- 클라이언트
- Sort
- 파일
- 쓰레드
- UML
- 안드로이드
- 데이터베이스
- 악보
- 정렬
- 프로세스
- 스레드
- C/C++
- 라즈베리파이
- MFC
- 티그널
- 액터
- 소켓 프로그래밍
- 클래스
- 리눅스
- 소켓
- 터미널
- C++
- 디렉터리
- 유즈케이스
- 티라노 시그널
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |