반응형
정렬 전 3 7 9 1 2
1차 정렬 3 7 9 1 2
2차 정렬 3 7 9 1 2
3차 정렬 1 3 7 9 2
4차 정렬 1 2 3 7 9
비교 횟수는 데이터 수와 같다. 최악의 경우엔 N(N-1)/2 의 계산이 필요하다.
또한 데이터의 이동 횟수도 N(N-1)/2의 계산이 나온다
따라서 정렬이 잘된 리스트를 가지고 삽입 정렬을 하면 선택 정렬에 비해 빠를 수 있다.
왜냐면 삽입 정렬의 비교가 비교적 선택 정렬보다 적을 수 있기 때문이다.
그래서 정렬이 잘 되어 있다면 O(N)에 가까운 계산이 나올 수 있다.
다만 정렬이 안된 상태라면 선택 정렬이 빠를 수 있다.
Big-O 표기법의 의한 O(N^2)이다.
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define TRUE 1
#define FALSE 0
// 함수의 프로토타입
void MakeRandomNumber(void);
void InsertionSort(void);
void DisplayBuffer(void);
int IsNumberExit(int, int);
int Buf[MAX];
void main()
{
printf("정렬할 데이터의 초기화\n");
MakeRandomNumber();
DisplayBuffer();
printf("정렬 후 데이터\n");
InsertionSort();
DisplayBuffer();
printf("\n");
}
//정렬할 데이터의 초기화
void MakeRandomNumber(void)
{
int i, Num;
i=1;
Buf[0]=100;
while(i < MAX)
{
Num = rand() % MAX;
if(!IsNumberExit(Num, i))
{
Buf[i]=Num;
i++;
}
}
}
// 이미 생성된 값이 아닌지를 검사
int IsNumberExit(int number, int index)
{
int i;
for(i=1; i < index; i++)
{
if(Buf[i] == number)
return TRUE;
}
return FALSE;
}
void InsertionSort(void) // 정렬 함수
{
int i, j, dummy;
for(i=1; i < MAX; i++)
{
dummy = Buf[i];
j = i;
while(Buf[j-1] > dummy && j > 0)
{
Buf[j] = Buf[j-1];
j--;
}
Buf[j] = dummy;
}
}
void DisplayBuffer(void)
{
int i;
for(i=0; i < MAX; i++)
{
printf("%4d", Buf[i]);
if((i % 10) == 9 )
printf("\n");
}
printf("\n");
}
반응형
'Programings > Algorithms' 카테고리의 다른 글
[Algorith] 쉘 정렬 (Shell Sort) (0) | 2010.09.07 |
---|---|
[Algorith] 버블 정렬 (Bubble Sort) (0) | 2010.09.07 |
[Algorith] 선택 정렬 (Selection sort) (0) | 2010.09.07 |
[Algorith] 이진 트리 (Tree) - 레벨 순회 (Level-Order Traverse) (0) | 2010.08.18 |
[Algorith] 이진 트리 (Tree) - 후위 순회 (Post-Oreder Traverse) (4) | 2010.08.18 |