바킹독의 실전 알고리즘 0x0E강 ( 정렬 I )
목차
- 0x00 기초 정렬
- 0x01 Merge Sort
- 0x02 Quick Sort
1. 기초 정렬
int arr[10] = {3, 2, 7, 116, 62, 235, 1, 23, 55, 77};
int n = 10;
for(int i = n-1; i > 0; i--){
int mxidx = 0;
for(int j = 1; j <= i; j++){
if(arr[mxidx] < arr[j]) mxidx = j;
}
swap(arr[mxidx], arr[i]);
}
int arr[10] = {3, 2, 7, 116, 62, 235, 1, 23, 55, 77};
int n = 10;
for(int i = n-1; i > 0; i--){
swap(*max_element(arr, arr+i+1), arr[i]);
}
2. Merge sort
- 재귀적으로 수열을 나눠 정렬한 후 합치는 정렬법
- O(NlgN)
- 먼저 길이가 N,M인 두 정렬된 리스트를 합쳐서 길이 N + M의 정렬된 리스트를 만드는 방법을 알아야 함
1) BOJ 11728번 : 배열 합치기
1-1) C
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[1000005], b[1000005], c[2000005];
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(int i = 0; i< n; i++) cin >> a[i];
for(int i = 0; i< m; i++) cin >> b[i];
int aidx = 0; bidx = 0;
for(int i = 0; i < n + m; i++){
if(bidx == m) c[i] = a[aidx++];
else if(aidx == n) c[i] = b[bidx++];
else if(a[aidx] <= b[bidx]) c[i] = a[aidx++];
else c[i] = b[bidx++];
}
for(int i = 0; i< n+m; i++) cout << c[i] << ' ';
}
1-2) Java
2) Stable Sort
- 먼저 그림의 사람들을 나이순으로 정렬하는 상황
- 나머지 3명의 나이가 같이때문에 3명에 대해서 정렬이 제각각일 수 있음
- 같은 원소들끼리는 원래의 순서로 따라가도록 하는 정렬이 Stable Sort
- 정렬전 나이가 같은 사람의 옷색깔은 파랑 빨강 초록 순이니 정렬 후에도 파랑 빨강 초록 순
3. Quick Sort
- 퀵 소트는 머지 소트처럼 재귀적으로 구현되는 정렬
- 매 단계마다 pivot이라는 이름 붙은 원소 하나를 제자리로 보내는 작업을 반복
int arr[8] = {6, -8, 1, 12, 8, 3, 7, -7};
int pivot = arr[0];
int l = 1, r= 7;
while(1){
while(l <= r && arr[l] <= pivot) l++;
while(l <= r && arr[r] > pivot) r00;
if(l > r) break;
swap(arr[l], arr[r]);
}
swap(arr[0], arr[r]);
1) 장점
- 추가적인 공간이 필요하지 않다는 점에 있다.
- 그 배열안에서 자리 바꿈만으로 처리가 되기 때문에 cache hit rate가 높아서 속도가 빠르다.
2) Quick sort 구현
#include <bits/stdc++.h>
using namespace std;
int n = 10;
int arr[1000001] = {...};
void quick_sort(int start, int end){
if(end <= start +1) return;
int pivot = arr[start];
int l = start + 1;
int r = end -1;
while(1){
while(l <= r && arr[l] <= pivot) l++;
while(l <= r && arr[r] > pivot) r00;
if(l > r) break;
swap(arr[l], arr[r]);
}
swap(arr[0], arr[r]);
quick_sort(start, r);
quick_sort(r+1, end);
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
quick_sort(0, n);
for(int i = 0; i< n; i++) cout << arr[i] << ' ';
}
3)
4. Merge Sort vs Quick Sort
출처
[바킹독의 실전 알고리즘] 0x0E강 - 정렬 I
댓글남기기