본문 바로가기

C언어/자료구조

6-4장 단순 삽입 정렬

1. 단순 삽입 정렬 알아보기 

 

단순 삽입 정렬 (straight insertion sort)

 

- 선택한 요소를 그보다 더 앞쪽의 알맞은 위치에 '삽입'하는 작업을 반복하여 정렬

- 아직 정렬되지 않은 부분의 첫 번째 요소를 정렬된 열의 '알맞은 위치에 삽입'하는 작업을 n-1회 반복 

 

- 배열 {6,4,1,7,3,9,8}의  단순삽입정렬과정

 

ex) 값이 3인 요소를 선택해 앞쪽의 알맞은 위치에 삽입하는 과정 

 

 

 <1~3>

 - 3보다 작은 요소를 만날 때까지 이웃한 왼쪽의 요소를 대입하는 작업을 반복 

 <4>

 - 멈춘 위치에 3을 대입 

 

- 반복 제어용 변수 j에 i 대입

- tmp에 a[i] 대입 (a[i] = 정렬되지 않은 부분의 첫 번째 요소)

- 종료 조건 중 하나를 만날 때까지 j를 1씩 감소하면서 대입하는 작업 반복

 

<종료 조건> OR

1) 정렬된 열의 왼쪽 끝에 도달

2) tmp보다 작거나 같은 key를 갖는 항목 a[j-1]을 발견

 

드모르간 법칙 적용 

 

<계속 조건> AND

 1) j가 0보다 큼 (j>0)

 2) a[j-1]값이 tmp보다 큼 (a[i-1] >tmp) 

  (a[j-1] = 정렬된 부분의 마지막 요소  = 정렬되지 않은 부분의 첫 번째 요소의 인접한 왼쪽요소)

j=i;
tmp = a[i];
while(j>0 && a[j-1] > tmp)
	a[j] = a[j-1];
    j--;
a[j] = tmp;

 

- 단순 삽입 정렬 프로그램

// 단순 삽입 정렬 
#include <stdio.h> 
#include <stdlib.h>

//단순 삽입 정렬 함수 
void insertion (int a[], int n) 
{
	for(int i=1; i<n; i++)
	{
		int tmp = a[i];
		int j;
		for(j=i; j>0 && a[j-1]>tmp; j--)
			a[j]=a[j-1];
		a[j] = tmp;
	}
}

int main()
{
	int nx;
	puts("단순 삽입 정렬");
	printf("요소 개수:");
	scanf("%d",&nx);
	int *x=(int*)calloc(nx,sizeof(int)); //요소의 개수가 nx인 int형 배열 x를 생성
	
	for(int i=0; i <nx; i++) {
		printf("x[%d]:", i);
	    scanf("%d",&x[i]);
	}
	
	insertion(x,nx); //배열 x를 단순 삽입 정렬
	
	puts("오름차순으로 정렬했습니다.");
	for(int i=0; i <nx; i++) 
		printf("x[%d]=%d\n", i, x[i]);
	
	free(x); //배열을 해제 
	
	return 0; 
}

 

'C언어 > 자료구조' 카테고리의 다른 글

6-6장 퀵 정렬(1)  (0) 2023.07.31
6-5장 쉘 정렬  (0) 2023.07.31
6-3장 단순 선택 정렬  (0) 2023.07.28
6-2장 버블 정렬  (0) 2023.07.28
6-1장 정렬  (0) 2023.07.28