#include <malloc.h>
#define MAX 10
void optimized1_insertion_sort(int arr[], int n) {
for (int i = 1; i <= n; ++i) {
int j = i;
int tmp = arr[i];
// 1~10 index 를 사용하기 때문에 j > 0 조건이 필요없음
while (arr[j - 1] > tmp) {
arr[j] = arr[j - 1];
--j;
}
arr[j] = tmp;
}
}
void print(int arr[], int n) {
printf("Result :");
for (int i = 1; i <= n; ++i) {
printf(" %d", arr[i]);
}
printf("\n");
}
int main()
{
int arr[MAX + 1] = {-1, 10, 5, 1, 4, 9, 2, 6, 8, 7, 3 };
optimized1_insertion_sort(arr, MAX);
print(arr, MAX);
return 0;
}
* 최적화2 - Indirect Sort 사용 (Memory 연산으로만 동작하는 경우가 아닌, File I/O 등의 Data 연산이 이루어질 때)
- 실제 데이터가 아닌 Index를 정렬 후에, Data 를 정렬하는 방법
#include <stdio.h>
#include <malloc.h>
#define MAX 10
void indirect_insertion_sort(int arr[], int index[], int n) {
for (int i = 0; i < n; ++i) {
index[i] = i;
}
for (int i = 1; i < n; ++i) {
int j = i;
int tmp = index[i];
while (j > 0 && arr[index[j - 1]] > arr[tmp]) {
index[j] = index[j - 1];
--j;
}
index[j] = tmp;
}
}
void rearrange(int arr[], int index[], int n) {
int *p = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; ++i) {
p[i] = arr[index[i]];
}
for (int i = 0; i < n; ++i) {
arr[i] = p[i];
}
free(p);
}
void print(int arr[], int n) {
printf("Result :");
for (int i = 0; i < n; ++i) {
printf(" %d", arr[i]);
}
printf("\n");
}
int main()
{
int arr[MAX] = { 10, 5, 1, 4, 9, 2, 6, 8, 7, 3 };
int index[MAX];
indirect_insertion_sort(arr, index, MAX);
rearrange(arr, index, MAX);
print(arr, MAX);
return 0;
}
* 최적화3 - Binary Search 사용
'SW > 알고리즘' 카테고리의 다른 글
Internal/External & Direct/InDirect Sort (0) | 2019.05.11 |
---|---|
Insertion Sort 1 (0) | 2019.05.11 |
Selection Sort (0) | 2019.05.11 |
Recursive Call - Factorial, Fibonacci, Hanoi Tower (0) | 2019.02.23 |
Tree Traversal4 - Level order Traversal (Breadth-First Traversal) (0) | 2019.02.23 |