[데이터 구조--손찢기 정렬 1부] 삽입 정렬

목차

1. 일반적인 정렬 알고리즘

2. 삽입 정렬의 아이디어

2.1 기본 아이디어

2.2 직접 삽입 정렬

2.2.1 단일 패스 정렬의 아이디어

2.2.2 단일 패스 정렬 코드 구현

3. 정렬 코드 삽입

4. 삽입 정렬 + 인쇄 테스트

5. 삽입정렬의 시간복잡도

5.1 최악의 경우

5.2 최상의 경우

6. 직접 삽입 정렬의 특성 요약


1. 일반적인 정렬 알고리즘

 

2. 삽입 정렬의 아이디어

2.1 기본 아이디어

직접삽입정렬은 간단한 삽입정렬 방식으로
정렬할 레코드를 키값의 크기에 따라 정렬된 순서대로 하나씩 모든 레코드가 삽입될 때까지 삽입하여 새로운 정렬을 얻는 것이 기본 개념이다. 순서.

실제로 포커를 할 때 삽입 정렬이라는 아이디어를 사용합니다.

 

2.2 직접 삽입 정렬

i 번째(i>=1) 요소 삽입 시 앞선 array[0], array[1],...,array[i-1]이 정렬되어 있으며 이때 정렬코드는 array를 사용한다. [i]와 Array[i-1], array[i-2], ... 정렬 코드의 순서를 비교하여 삽입 위치를 찾아 array[i]를 삽입하고 원래 위치에 있는 요소의 순서 뒤로 이동됩니다.

2.2.1 단일 패스 정렬의 아이디어

배열의 마지막 요소의 맨 아래를 end로 표시하고 삽입할 숫자가 end+1 위치에 처음 배치될 때마다 임시 변수 tmp를 사용하여 숫자를 저장하고 다음과 같이 비교합니다. tmp가 end보다 작은 경우 end를 한 비트 뒤로 이동시킨 후 tmp를 end-1, end-2...와 비교하여 tmp가 특정 위치의 요소보다 크면 tmp를 삽입합니다. 위치 첨자 + 1 위치, 단일 패스 정렬이 완료됩니다.

 

2.2.2 단일 패스 정렬 코드 구현

int tmp = a[end + 1];
while (end >= 0)
{
    if (a[end] > tmp)
    {
        a[end + 1] = a[end];
        end--;
    }
    else
    {
        break;
    }
}
a[end + 1] = tmp;

a[end] < tmp일 때 루프에서 빠져나온 다음 tmp를 a[end+1] 위치에 삽입하는 영리한 코드 작성 방법이 있습니다 . 이것은 a[end] < tmp 와 첫 번째 요소 <tmp 의 삽입을 동시에 해결할 수 있습니다.

3. 정렬 코드 삽입

삽입정렬은 싱글패스 정렬을 기본으로 배열 전체를 한 번에 정렬하는 것으로, 삽입정렬을 위해 싱글패스 정렬 코드에 루프 레이어를 추가한다.

for (int i = 1; i < n; i++)
{
    int end = i - 1;
    int tmp = a[i];

    while (end >= 0)
    {
        if (a[end] > tmp)
        {
            a[end + 1] = a[end];
            end--;
        }
        else
        {
            break;
        }
    }
    a[end + 1] = tmp;
}

4. 삽입 정렬 + 인쇄 테스트

void Print(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}
void InsertSort(int* a, int n)
{
	for (int i = 1; i < n; i++)
	{
		int end = i - 1;
		int tmp = a[i];

		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}
void TestInsert()
{
	int a[] = { 9,8,7,6,5,4,3,2,1 };
	InsertSort(&a, sizeof(a) / sizeof(int));
	Print(&a, sizeof(a) / sizeof(int));
}
int main()
{
	TestInsert();
	return 0;
}

결과 보여줘:

 

5. 삽입정렬의 시간복잡도

5.1 최악의 경우

최악의 경우는 최악의 경우인 역순이며 시간 복잡도는 O(N^2) 입니다 .

5.2 최상의 경우

가장 좋은 상황은 순서가 정돈되어 있고 조정할 필요가 없으며 배열을 한 번만 통과하면 되는 것입니다. 시간 복잡도는 O(N) 입니다 .

6. 직접 삽입 정렬의 특성 요약

1. 요소 집합이 순서에 가까울수록 직접 삽입 정렬 알고리즘의 시간 효율성이 높아집니다.
2. 시간 복잡도: O(N^2) 3. 공간 복잡도: O(1), 안정적인 정렬 알고리즘
입니다4 .
안정성: 안정적

추천

출처blog.csdn.net/Ljy_cx_21_4_3/article/details/131501971