๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Job/Interview

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ

by oliviarla 2022. 4. 14.

์„ ํƒ ์ •๋ ฌ

  • ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ์•„ ๋งจ ๋งˆ์ง€๋ง‰์˜ ์›์†Œ์™€ swap
  • O(N^2)
int arr[10] = {2, 53, 76, 4, 5, 3, 13, 32, 88, 25};
int n=10;
for(int i=n-1;i>0;i--){
    swap(*max_element(arr, arr+i+1), arr[i]);
}

๋ฒ„๋ธ” ์ •๋ ฌ

  • ์•ž์—์„œ๋ถ€ํ„ฐ ์ธ์ ‘ํ•œ ๋‘ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ํฐ ๊ฐ’์„ ๋’ค๋กœ ๋ณด๋ƒ„ -> ์ ์ฐจ ๊ฐ€์žฅ ํฐ ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๊ฒŒ ๋จ
  • O(N^2)
int arr[5] = {-2, 2, 4, 6, 13};
int n=5;
for(int i=0;i<n;i++){
    for(int j=0;j<n-1-i;j++){
        if(arr[j]>arr[j+1) swap(arr[j], arr[j+1]);
    }
}

Merge Sort

  • ๋ฐฐ์—ด์„ ์ด๋“ฑ๋ถ„ํ•˜์—ฌ ์›์†Œ๊ฐ€ ํ•˜๋‚˜๊ฐ€ ๋  ๋•Œ ๊นŒ์ง€ ๋‚˜๋ˆˆ ํ›„, ๋‘ ๋ฐฐ์—ด์”ฉ ํ•ฉ์น˜๋ฉด์„œ ์ •๋ ฌ
  • Stable Sort
  • O(NlgN)
#include <bits/stdc++.h>
using namespace std;
int n;
int arr[1000001];
int tmp[1000001];

void merge(int st, int en){
    int mid=(st+en)/2;
    int idx1=st, idx2=mid;
    for(int i=st;i<en;i++){
        if(idx1==mid) tmp[i]=arr[idx2++];
        else if(idx2==en) tmp[i]=arr[idx1++];
        else if(arr[idx1]<=arr[idx2]) tmp[i]=arr[idx1++];
        else tmp[i]=arr[idx2++];
    }
    for(int i=st;i<en;i++) arr[i]=tmp[i];
}

void merge_sort(int st, int en){
    if(en-1==st) return;
    int mid=(st+en)/2;
    merge_sort(st, mid);
    merge_sort(mid, en);
    merge(st, en);
}

int main(void){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin>>n;
    for(int i=0;i<n;i++) cin>>arr[i];
    merge_sort(0,n);
    for(int i=0;i<n;i++) cout<<arr[i]<<"\n";
}

Quick Sort

  • pivot๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ pivot๋ณด๋‹ค ์ž‘์€ ์ˆ˜๋ฅผ pivot์˜ ์™ผ์ชฝ์—, pivot๋ณด๋‹ค ํฐ ์ˆ˜๋ฅผ pivot์˜ ์˜ค๋ฅธ์ชฝ์— ์ €์žฅ
  • ๋ฐฐ์—ด ์•ˆ์—์„œ์˜ ์ž๋ฆฌ๋ฐ”๊ฟˆ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ๋†’์€ cache hit rate -> ๋น ๋ฅธ ์†๋„๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • ์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ •๋ ฌ(In-Place Sort)
  • O(NlgN), ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” O(N^2)
void quick_sort(int st, int en) { // arr[st to en-1] ์ •๋ ฌ
  if(en <= st+1) return; // ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ 1 ์ดํ•˜์ด๋ฉด ํ•จ์ˆ˜ ์ข…๋ฃŒ.(base condition)
  int pivot = arr[st]; // ๋งจ์•ž ์›์†Œ๋ฅผ pivot์œผ๋กœ ์žก์Œ
  int l = st+1; // ํฌ์ธํ„ฐ l
  int r = en-1; // ํฌ์ธํ„ฐ r
  while(1){
    while(l <= r && arr[l] <= pivot) l++;
    while(l <= r && arr[r] >= pivot) r--;
    if(l > r) break; // l๊ณผ r์ด ์—ญ์ „๋˜๋Š” ๊ทธ ์ฆ‰์‹œ ํƒˆ์ถœ
    swap(arr[l], arr[r]);
  }
  swap(arr[st], arr[r]); //pivot๊ณผ r ๊ฐ’ ๋ณ€๊ฒฝ -> pivot ์™ผ์ชฝ์€ pivot๋ณด๋‹ค ์ž‘์€๊ฐ’, ์˜ค๋ฅธ์ชฝ์€ ํฐ ๊ฐ’์œผ๋กœ ์ •๋ ฌ
  quick_sort(st, r);
  quick_sort(r+1, en);
}

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] << ' ';
}

 

 

์ถœ์ฒ˜: https://blog.encrypted.gg/955

๋Œ“๊ธ€