Machineboy空

Sorting(정렬) - bubble, selection, insertion, quick, merge, radix 본문

Computer/알고리즘

Sorting(정렬) - bubble, selection, insertion, quick, merge, radix

안녕도라 2023. 10. 14. 14:00

정렬의 종류

버블 (bubble) 데이터의 인접 요소끼리 비교하고, swap 연산을 수행하며 정렬하는 방식
선택 (selection) 대상에서 가장 크거나 작은 데이터를 찾아가 선택을 반복하면서 정렬하는 방식
삽입 (insertion) 대상을 선택해 정렬된 영역에서 선택 데이터의 적절한 위치를 찾아 삽입하면서 정렬하는 방식
퀵 (quick) pivot 값을 선정해 해당 값을 기준으로 정렬하는 방식
병합 (merge) 이미 정렬된 부분 집합들을 효율적으로 병합해 전체를 정렬하는 방식
기수 (radix) 데이터의 자릿수를 바탕으로 비교해 데이터를 정렬하는 방식

 

 

 

버블정렬(Bubble Sort)

  • 두 인접한 데이터의 크기를 비교해 정렬하는 방법
  • 시간복잡도는 n2^으로 다른 정렬 알고리즘보다 속도가 느리다.
    • 시간복잡도 n2^ : n = 5 라면, 루프 한 번 도는데 n번, 그리고 루프 n번을 도니까 n제곱이 된다.

N = int(input())
A = [0]* N

for i in range(N):
    A[i] = int(input())

for i in range(N-1):            
    for j in range(N-1-i):      
        if A[j] > A[j+1]:
            temp = A[j]
            A[j] = A[j+1]
            A[j+1] = temp

for i in range(N):
    print(A[i])

 

선택정렬(Selection Sort)

  • 최솟값 또는 최댓값을 찾고 남은 정렬 부분의 가장 앞에 있는 데이터와 swap하는 것이 핵심
    • 남은 정렬부분(정렬해야하는 부분)에서 min, max를 찾아가며 swap해주는 방식
  • 구현 방법이 복잡하고 시간 복잡도도 n2^로 효율적이지 않아서 많이 사용하지 않는다.
    • 시간복잡도 n2^ :
      • n = 5라면 처음에 n만큼 탐색 후 맨 앞 fix
      • 그 다음 n-1, n-2... n-n : n만큼 반복 

삽입 정렬(Insertion Sort)

  • 이미 정렬된 데이터의 범위에 정렬되지 않은 데이터를 적절한 위치에 삽입시켜 정렬하는 방식
  • 시간 복잡도 : n2^ 느린 편이지만 구현하기 쉽다

퀵 정렬(Quick Sort)

https://youtu.be/aXXWXz5rF64?si=nvD28Z0-D14HATpA

병합 정렬(Merge Sort)

기수 정렬(Radix Sort)

 

 만약 생소한 분야의 프로그램을 개발하려 한다면, '반드시' 어떤 것들이 이미 되어 있는지를 알아내서, 다른 사람들이 이미 잘해 놓은 것을 어설프게 다시 하느라 시간을 낭비하지 않도록 해야 한다. 

 모든 프로그램은 알고리즘과 데이터 구조에 의지하지만, 완전히 새로운 알고리즘이나 데이터 구조를 발명해서 써야 하는 프로그램은 아주 드물다. 컴파일러나 웹 브라우저처럼 복잡한 프로그램이라도 내부에서 쓰는 데에터 구조는 대부분 배열, 리스트, 트리, 해시 테이블이다. 어떤 프로그램에서 더 정교한 데이터 구조를 필요로 한다 해도, 이 단순한 구조들을 바탕으로 만들게 될 것이다. 따라서 대다수의 프로그래머들이 해야 할 일은 어떤 알고리즘과 데이터 구조를 쓸 수 있을지 파악하고 여러 대안 중 하나를 선택하는 방법을 이해하는 것이다. 

 요약하면 다음과 같다. 거의 모든 프로그램에 등장하는 기본 알고리즘은 (주로 검색과 정렬) 손에 꼽을 정도로 적으며, 그나마도 이미 라이브러리에 포함되어 있는 경우가 많다. 마찬가지로 거의 모든 데이터 구조도 몇 개의 기본 구조에서 파생된다. (중략) 필요하다면 이 코드들을 그대로 사용해도 상관없지만 그 전에 먼저 자신이 쓰는 프로그래밍 언어와 그 라이브러리가 무엇을 제공하는지 조사하는 것을 잊지 말자.

 

https://wing-beat.tistory.com/18

 

C++ 알고리즘:: 정렬 알고리즘 정리 (버블 정렬, 선택 정렬, 삽입 정렬, 퀵 정렬, 병합 정렬)

Sorting Algorithm 정렬 알고리즘 Big O는 알고리즘의 퍼포먼스를 이해하기 쉽고 효율적으로 작성하는 방법이다. 그러나 Big O가 모든 알고리즘을 완벽하게 설명하는 것은 아니다. 알고리즘이 같은 Big O

wing-beat.tistory.com

 

https://velog.io/@ajm0718/%EC%A0%95%EB%A0%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%97%90-%EB%8C%80%ED%95%9C-%EB%B3%B5%EC%9E%A1%EB%8F%84

 

정렬 알고리즘에 대한 복잡도

정렬 알고리즘에 대한 간단한 설명과 시간 복잡도 & 공간 복잡도

velog.io