삽입 정렬
비교 대상이 될 데이터를 선택한 후 해당 데이터를 특정한 기준에 맞춰 적당한 곳에 삽입하고 다시 정렬하는 것을 삽입 정렬이라 한다.
일반적으로 버블 정렬과 시간복잡도는 비슷하지만 이미 정렬되어 있을 경우 반복문을 생략할 수 있으므로 버블 정렬보다 더 효율적이다. 아래 코드는 오름 차순을 구현한 코드이다.
전체 코드
#include <iostream>
#include <cstring>
void InsertionSort(int DataSet[], int Length)
{
int value = 0;
for (int i = 1; i < Length; i++)
{
if (DataSet[i - 1] <= DataSet[i])
{
for (int i = 0; i < Length; i++)
std::cout << DataSet[i] << ' ';
std::cout << std::endl;
continue;
}
value = DataSet[i];
for (int j = 0; j < i; j++)
{
if (DataSet[j] > value)
{
// memmove(&DataSet[j + 1], &DataSet[j], sizeof(DataSet[0]) * (i - j));
for (int k = i; k > j; k--)
DataSet[k] = DataSet[k - 1];
DataSet[j] = value;
break;
}
}
}
}
int main(void)
{
int DataSet[] = { 6, 4, 2, 3, 1, 5 };
int Length = sizeof DataSet / sizeof DataSet[0];
InsertionSort(DataSet, Length);
for (int i = 0; i < Length; i++)
std::cout << DataSet[i] << ' ';
std::cout << std::endl;
return 0;
}
memmove 함수
순환문은 j인덱스부터 value의 값보다 작은 값들을 한칸 씩 밀기 위해 동작하고 있는데 이 과정을 memmove함수로 간단히 할 수 있다. memmove 함수의 원형 첫번째 매개변수는 데이터가 이동될 메모리 위치이고 두번째 매개변수는 데이터를 이동시킬 메모리의 위치이다. 세번째 매개변수는 해당 데이터의 크기이며 위에 알고리즘은 i - j만큼의 크기, i보다 작고 자신보다 큰 인덱스들을 모두 이동시킨다는 의미이다.
https://blockdmask.tistory.com/444
'과거 자료' 카테고리의 다른 글
[#11] Counting Sort : 계수 정렬, 카운팅 정렬 (0) | 2022.08.19 |
---|---|
[#10] Quick Sort : 퀵 정렬 (0) | 2022.08.16 |
[#8] Bubble Sort : 버블 정렬 (0) | 2022.08.13 |
[#7] Disjoint Set (분리 집합) (0) | 2022.08.10 |
[#6] Expression Tree (수식 트리) (0) | 2022.08.07 |