[ 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 |