데이터 구조 : 공통 정렬 알고리즘 (2) : 직접 삽입 정렬 (C ++ 구현)

데이터 구조 : 공통 정렬 알고리즘 (2) : 직접 삽입 정렬

삽입 정렬 :

1. 아이디어 : 각 단계에서 정렬 할 레코드는 모든 삽입이 정렬 될 때까지 시퀀스 코드 크기에 따라 이전에 정렬 된 단어 시퀀스의 적절한 위치에 삽입됩니다.
2. 핵심 질문 : 이전에 정렬 된 순서에서 적절한 삽입 위치를 찾으십시오.
방법 :직접 삽입 정렬 , 이진 삽입 정렬 , 셸 정렬

직접 삽입 정렬

1. 기본 아이디어 :

각 단계에서 정렬 할 레코드는 모든 삽입이 정렬 될 때까지 시퀀스 코드 크기에 따라 (뒤에서 앞으로 적절한 위치를 찾은 후) 이전에 정렬 된 단어 시퀀스의 적절한 위치에 삽입됩니다. (가장 간단한 정렬 방법입니다. 기본 작업은 정렬 된 정렬 된 목록에 레코드를 삽입하여 레코드 수가 1 증가한 새 정렬 된 목록을 얻는 것입니다.)

2. 예

*** 예 1 : 직접 삽입 방법을 사용하여 a [6] = {20,30,40,10,60,50} 배열 정렬 ***

img

[이미지 출처 : https://www.cnblogs.com/zwtgyh/p/10631760.html]

암호

첫 번째 구현 방법 : 두 개의 for 루프 사용

#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	/* 插入排序*/
	int num[6] = { 20, 30, 40, 10, 60, 50 };
	int temp;
	int i, j;
	int length = sizeof(num) / sizeof(num[0]);
	for (i = 1; i < length; i++)
	{
		temp = num[i];    //待排序元素
		for (j = i - 1; j >= 0 && num[j] > temp; j--)
		{
			num[j + 1] = num[j];
		}
		num[j + 1] = temp;
	}
	for (int i = 0; i < length; i++)
	{
		cout << num[i] << " ";
	}
	return 0;
}

두 번째 실현 방법 :

#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	/* 插入排序*/
	int num[6] = { 20, 30, 40, 10, 60, 50 };
	int pos, temp;
	int length = sizeof(num) / sizeof(num[0]);
	for (int i = 1; i < length; i++)
	{
		pos = i - 1;    //有序序列的最后一个元素位置
		temp = num[i];    //保存待排序元素的值
		while (pos >= 0 && num[pos] > temp)
		{
			num[pos + 1] = num[pos];
			pos--;
		}
		num[pos + 1] = temp;    //将待排序元素插入数组中
	}
	for (int i = 0; i < length; i++)
	{
		cout << num[i] << " ";
	}
	return 0;
}

** 예 2 : 직접 삽입 정렬을 사용하여 b [15] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48} 배열 정렬

img

[이미지 출처 : https://www.cnblogs.com/zwtgyh/p/10631760.html]

암호

위와 같은 방법으로 두 방법 모두 실현 가능

방법 1 :

#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	/* 插入排序*/
    int num[15] = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 };
	int temp;
	int i, j;
	int length = sizeof(num) / sizeof(num[0]);
	for (int i = 1; i < length; i++)
	{
		temp = num[i];    //待排序元素
		for (int j = i - 1; j >= 0 && num[j] > temp; j--)
		{
		C	num[j + 1] = num[j];
		}
		num[j + 1] = temp;
	}
	for (int i = 0; i < length; i++)
	{
		cout << num[i] << " ";
	}
	return 0;
}

방법 2 :

#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	/* 插入排序*/
	int num[15] = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 };
	int pos, temp;
	int length = sizeof(num) / sizeof(num[0]);
	for (int i = 1; i < length; i++)
	{
		pos = i - 1;    //有序序列的最后一个元素位置
		temp = num[i];    //保存待排序元素的值
		while (pos >= 0 && num[pos] > temp)
		{
			num[pos + 1] = num[pos];
			pos--;
		}
		num[pos + 1] = temp;    //将待排序元素插入数组中
	}
	for (int i = 0; i < length; i++)
	{
		cout << num[i] << " ";
	}
	return 0;
}

3. 요약 :

1. 삽입 정렬의 가장 좋은 경우는 배열이 이미 정렬되어 있다는 것입니다. 이때 n-1 비교 만 필요하며 시간 복잡도는 O (n)입니다.

2. 최악의 경우 배열이 역순으로 정렬되는 경우가 있는데 이때 n (n-1) / 2 비교와 n-1 할당 연산 (삽입)이 필요합니다.

3. 평균적으로 삽입 정렬 알고리즘의 복잡성은 O (n2)입니다.

4. 공간 복잡도 측면에서 직접 삽입 방법은 제자리에 정렬하고 공간 복잡도는 (O (1))입니다.

추천

출처blog.csdn.net/qq_43801020/article/details/108134951