[ Quick Sort ]
- 이미 정렬되어있는 경우 O(N^2) 알고리즘이 됨에 유의
#include <stdio.h>
#include <memory>
using namespace std;
void swap(int input[], int a, int b)
{
int temp = input[a];
input[a] = input[b];
input[b] = temp;
}
int partition(int input[], int low, int high)
{
int index = low;
for (int i = low; i < high; i++) // 여기서 high를 일단 pivot으로 보고있으므로 high는 빠져야한다.
{
if (input[i] <= input[high])
{
swap(input, i, index);
index++;
}
}
swap(input, index, high);
return index;
}
void qsort2(int input[], int low, int high)
{
if (low >= high) return;
int pivot = partition(input, low, high);
qsort2(input, low, pivot - 1);
qsort2(input, pivot + 1, high);
}
int main(void)
{
int input[10];
for (int i = 0; i < 10; i++) scanf("%d", &input[i]);
qsort2(input, 0, 9);
for (int i = 0; i < 10; i++) printf("%d\n", input[i]);
return 0;
}[ Merge Sort ]
- Stable Sort 정렬 알고리즘 중에 하나이다. 정렬할 배열의 원소가 같은 값을 갖는 경우 그 둘의 순서가 바뀌지 않는 경우 Stable Sort라고 한다.
#include <stdio.h>
#define MAX_DATA_SIZE 1000000
int data[MAX_DATA_SIZE] = { 0 };
int tempData[MAX_DATA_SIZE] = { 0 };
void merge(int start, int end)
{
register int i = start;
register int mid = (start + end) / 2;
register int j = mid + 1;
register int k = 0;
while (i <= mid && j <= end)
{
if (data[i] <= data[j]) tempData[k++] = data[i++];
else tempData[k++] = data[j++];
}
while (i <= mid) tempData[k++] = data[i++];
while (j <= end) tempData[k++] = data[j++];
for (register int i = start; i <= end; i++)
data[i] = tempData[i - start];
}
void mergeSort(int start, int end)
{
if (start == end) return;
int mid = (start + end) / 2;
mergeSort(start, mid);
mergeSort(mid + 1, end);
merge(start, end);
}
int main(void)
{
int N;
scanf("%d", &N);
for (register int i = 0; i < N; i++) scanf("%d", &data[i]);
mergeSort(0, N - 1);
for (register int i = 0; i < N; i++) printf("%d\n", data[i]);
return 0;
}'Algorithm > Algorithm' 카테고리의 다른 글
| 조합 활용하기 (0) | 2019.09.13 |
|---|---|
| 파스칼의 삼각형 (0) | 2018.10.01 |
| [그래프] 인접 리스트 (0) | 2018.08.21 |
| 소수 구하기, 소인수분해 (0) | 2018.08.16 |
| 최대공약수 최소공배수, 진법 (0) | 2018.08.15 |