Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

알고리즘 스터디(정렬) Seungdols

2,964 views

Published on

알고리즘 중 정렬 파트를 리마인드하고,
추가적으로 기수정렬, 계수정렬, 쉘 정렬에 대해 공부한 자료입니다.

Published in: Software
  • Be the first to comment

알고리즘 스터디(정렬) Seungdols

  1. 1. Seungdols http://seungdols.tistory.com/ 알고리즘 스터디 Algorithm Study
  2. 2. Index 하나, 기본 개념 둘, Sort 소개 셋, 생각 해보기 넷, 질의응답
  3. 3. 하나, 기본 개념 정렬 알고리즘이란 원소들을 번호순이나 사전 순서와 같이 일정한 순서대로 열거하는 알고리즘이다.
  4. 4. 하나, 기본 소개 Stability?!
  5. 5. 하나, 기본 소개 정렬시 안정적인지? 아닌지? Stability?!
  6. 6. 하나, 기본 소개 그림과 같이 기존 원소와 정렬 된 원소 결과가 같은 값에 대해 순서가 유지 되는지!! Stability?!
  7. 7. 하나, 기본 소개
  8. 8. 하나, 기본 소개
  9. 9. 하나, 기본 소개
  10. 10. 하나, 기본 소개 다양한 정렬 기법이 존재. 내가 배울 땐..저런거 배우지… 않…
  11. 11. 하나, 기본 소개 Heap Sort 를 쓰기 위해 Heap 먼저 구성 해야 한다.
  12. 12. 하나, 기본 소개 HeapSort를 사용하기 위해서는 BuildHeap 과정을 거쳐, Max – Heap / Min – heap을 구성 해야 한다. Heap이란 자료구조는 쉽게 말해, 완전 이진 트리의 한 종류이며, Max – Heap 의 경우 Root (부모) 노드가 자식 노드 보다 값이 크다. Min – Heap 의 경우 Root(부모) 노드가 자식 노드 보가 값이 작다. 고로, 최상위 Root의 경우 트리 내 (최대힙) 가장 최대의 값을 가지거나, (최소힙) 가장 최소의 값을 가지게 된다.
  13. 13. 하나, 기본 소개 HeapSort
  14. 14. 하나, 기본 소개 HeapSort
  15. 15. 하나, 기본 소개 HeapSort의 특징은 무엇일까요 ?
  16. 16. 하나, 기본 소개 HeapSort의 특징은 무엇일까요 ? Worst-case이더라도 O ( n log n )의 성능
  17. 17. 하나, 기본 소개 Selection Sort란 주어진 원소 내에서 최솟값을 찾고, 그 최솟값을 앞으로 보내며 정렬 하는 방식이다. • 가장 앞부터 정렬이 되기 시작한다. • 버블 정렬의 경우 제일 뒤부터 정렬이 됨.
  18. 18. 하나, 기본 소개 InPlaceSelectionSort
  19. 19. 하나, 기본 소개 원소를 비교하며 , 해당 원소가 들어갈 적절한 위치를 찾아 해당 위치에 삽입하는 정렬. 즉, 앞부터 정렬 되어가면서 더 작은 값이 나오면, 앞에 있는 원소들이 모두 한 칸씩 뒤로 밀린다.
  20. 20. 하나, 기본 소개 InPlaceInSertSort
  21. 21. 하나, 기본 소개 InPlaceSelectionSort
  22. 22. 둘, QuickSort 소개 원소 하나를 기준(피벗, pivot)으로 삼아 피벗 기준으로 좌측은 피벗 보다 더 작은 값 , 우측은 피벗 보다 큰 값으로 정렬 후. 피벗 기준으로 분할 나누어진 좌/우에서 다시 피벗을 잡고 다시 퀵 정렬을 실시한다. 분할 된 크기가 0이나 1이 될 때까지 정렬한다. 즉, 퀵 정렬은 Recursive 하게 동작 함. 찰스 앤터니 리처드 호어가 개발한 정렬 알고리즘. Pivot 파란색은 피벗보다 작거나 같고 빨간색은 피벗보다 크다.
  23. 23. 둘, QuickSort 소개 최악의 경우에는 시간복잡도가 O(n2)가 되는데, 피벗을 최솟값이나 최댓값으로 계속해서 잡게 되는 경우. 대표적인 예로는 피벗을 항상 배열의 첫 원소로 잡도록 구현한 알고리즘으로 이미 정렬된 배열을 정렬할 경우. 데이터가 극단적이면, 대충 구현된 퀵정렬은 최악의 결과를 초래함. 이를 방지하기 위하여 여러 기법들이 개발 되었는데, 대표적인 것이 피벗을 랜덤으로 잡는 것. 또는, 배열 중에 3개의 원소를 골라 중앙값을 피벗으로 고름.
  24. 24. 둘, QuickSort 소개 QuickSort가 평균적인 복잡도는 O ( n log n) 단, 가장 최악의 Case의 복잡도는 O ( 𝑛2 )이지만, 대부분의 컴퓨터 아키텍처에서 효율적으로 작동하도록 설계 되어있고, 제곱 시간이 걸릴 확률이 거의 없도록 알고리즘을 설계 하는 것이 가능하다.
  25. 25. 둘, Radix Sort 소개 기수 정렬은 자릿수가 있는 데이터(정수, 문자열 등)에서만 수행이 가능하며, 데이터끼리의 직접적인 비교 없이 정렬. 비교를 이용한 정렬이 아니기 때문에 k가 상수일 경우 시간복잡도가 O(n)으로 퀵정렬보다 빠른 시간복잡도가 나오는 것이 가능. 자릿수가 적은 4바이트 정수 등에서나 제대로 된 성능을 발휘할 수 있으며, 자릿수가 무한에 가까운 문자열 정렬 등에 사용할 경우 오히려 퀵정렬 보다 느릴 수 있고, 부동 소수점 등을 정렬에는 사용할 수가 없음.
  26. 26. 둘, Radix Sort 소개
  27. 27. 둘, Counting Sort 소개 Counting Sort의 큰 특징은 데이터 내의 가장 큰 값에 효율이 결정. 특정 데이터의 개수를 데이터의 값에 대응하는 위치에 저장. 자신의 위치에서 앞에 있던 값을 모두 더한 배열을 만들고, 데이터가 들어가야 할 위치를 찾아내는 알고리즘 복잡도는 데이터의 최댓값이 K라면 시간 복잡도는 O ( n + K )에 달한다. 단, K 값이 억 단위로 넘어간다면 시간은 기하급수적으로 상승하여 n이 작아도 시간이 오래 걸림. 반대로 K 작다면, 선형시간 내에 정렬을 끝냄.
  28. 28. 둘, Counting Sort 소개 5 12 7 10 12 0 00 0 1 2 a[0] a[1] a[12] K = 12 a[0] a[1] a[3] a[4]a[2] Counting Arr[K + 1] a[3] a[4]a[2] 데이터 원소 내 가장 큰 값을 K로 설정한다. CountingArr[k+1]을 생성 후
  29. 29. 둘, Counting Sort 소개 5 12 7 10 12 0 00 0 1 2 a[0] a[1] a[12] K = 12 a[0] a[1] a[3] a[4]a[2] Counting Arr[K + 1] 5 7 10 12 12 Result a[0] a[1] a[3] a[4]a[2] a[3] a[4]a[2] 데이터 원소를 순회하며, 숫자 값에 해당 하는 CountingArr 원소 위치에 + 1을 해준다.
  30. 30. 둘, Counting Sort 소개 5 12 7 10 12 0 00 0 1 2 a[0] a[1] a[12] K = 12 a[0] a[1] a[3] a[4]a[2] Counting Arr[K + 1] 5 7 10 12 12 Result a[0] a[1] a[3] a[4]a[2] a[3] a[4]a[2] Counting Arr의 배열을 순회하며, 0이 아니면, 값을 -1을 하고, result 배열에 (원소번호)해당하는 숫자 값을 써준다. 예시에서는 a[4]에 1이므로 -1을 해주고, Result 배열 첫 번째에 5를 넣어준다. 0이 되었으므로 다음 원소로 넘어간다. 이런 방법으로 카운팅 배열 원소를 모두 순회함.
  31. 31. 둘, Shell Sort 소개 삽입정렬이 거의 정렬된 배열에서 최적의 성능을 내는 것에 착안한 정렬 방법. 특징을 잘 이용한 정렬기법이며, 구조를 어떻게 하느냐에 따라 성능이 최대 O( 𝑛1.25 )의 성능을 보이기도 하여, Heap Sort에 버금 갈 정도.
  32. 32. 둘, Shell Sort 소개 쉘 정렬은 삽입정렬의 단점을 제거하고, 효율을 높인 정렬 기법으로 생각 할 수 있음. 요소들이 삽입 될 때 이웃한 위치로만 이동을 하게 되는데, 이 거리가 멀면 멀수록 Overhead가 증가하게 된다. 데이터를 일정의 간격을 만들고, 이 간격만큼 삽입 정렬을 통하여 정렬을 실행함. ( 데이터가 부분적 정렬 상태가 됨 ) 간격을 줄이다가 간격이 1이 되면 거의 정렬 된 리스트를 마지막으로 삽입정렬을 이용해 완전하게 정렬 된 결과를 얻을 수 있게 됨.
  33. 33. 둘, Shell Sort 소개 5 568 77 13 90 a[0] a[1] a[12]a[3] a[4]a[2] 10 85 77 18 90 a[0] a[1] a[12]a[3] a[4]a[2] Gap = 5 Gap = 3 5 108 18 77 90 a[0] a[1] a[12]a[3] a[4]a[2] Gap = 1 Gap = 1 인 상황은 거의 정렬이 된 상태에서 마지막으로 삽입정렬을 수행.
  34. 34. 셋, 생각 해보기 어떤 정렬 기법을 써야 하는가 ? 정렬 되어야 하는 데이터 값들이 큰 경우 !
  35. 35. 셋, 생각 해보기 어떤 정렬 기법을 써야 하는가 ? 정렬 되어야 하는 데이터 값들이 큰 경우 !
  36. 36. 셋, 생각 해보기 어떤 정렬 기법을 써야 하는가 ? 정렬 되어야 하는 데이터 값들이 큰 경우 ! 정렬 되어야 하는 값들이 많은 경우 !
  37. 37. 셋, 생각 해보기 어떤 정렬 기법을 써야 하는가 ? 정렬 되어야 하는 데이터 값들이 큰 경우 ! 어떤 상황에서도 평균적인 속도를 내야 하는 경우! 정렬 되어야 하는 값들이 많은 경우 !
  38. 38. 셋, 생각 해보기 정렬 기법들 중에서 가장 구현 하기 쉬운 것은 ?
  39. 39. 셋, 생각 해보기 정렬 기법들 중에서 가장 구현 하기 쉬운 것은 ? 정렬 기법들 사용시 공간 복잡도에 대해서도 고려 해야 할까?
  40. 40. 셋, 생각 해보기 정렬 기법들 중에서 가장 구현 하기 쉬운 것은 ? 정렬 기법들 사용시 공간 복잡도에 대해서도 고려 해야 할까? 공간 복잡도까지 고려 했을 때 어느 정렬을 써야 할까?
  41. 41. 넷, 질의응답 단, 저는 아는 것만 대답합니다. 질문 받습니다.
  42. 42. Seungdols 감사합니다.

×