Sort

정렬

정렬은 컴퓨터가 가장 많이 하는 행위 중 하나로 꼽힐 정도로, 매우 자주 발생한다. 그리고 그만큼 다양한 종류의 정렬 알고리즘도 존재한다.

  • 간단하지만 느린 정렬

    • bubble sort

    • insertion sort

    • selection sort

  • 복잡하지만 빠른 정렬

    • quick sort

    • merge sort

    • heap sort

  • O(n)

    • radix sort

Selection Sort

  • 제일 큰 값을 선택하여 맨 뒤의 요소와 자리를 바꾸면서 큰 값부터, 뒤에서부터 차례대로 정렬하는 것

  • 시간복잡도

    • 우선 for 문이 n-1 번 반복되고

    • 매번 가장 큰수를 찾느라 n-1, n-2, n-3 ... 번 탐색시간이 소요된다.

    • 가장 큰 값과 맨 마지막 요소를 교환하는 것 자체는 상수시간이 소요된다.

    • 결국, (n-1) + (n-2) + ... + (2) + 1 = O(n^2)

    • 최악의 경우나, 최선의 경우나 모두 같은 시간 복잡도를 가진다.

Bubble Sort

  • selection sort 와 비슷하게 가장 큰 값을 찾아, 제일 마지막 값으로 옮긴 뒤, 잊어버리고 나머지 값들을 대상으로 반복 작업을 하는 방식이지만,

  • 가장 큰 값을 맨 마지막 요소와 바꾸는 방법에서 차이가 존재한다.

  • 마치 그물로 고기를 몰아 잡는 것과 비슷하다고 한다. 잔챙이들은 그물을 빠져나가지만, 큰 물고기들은 빠져나갈 수 없다!

  • 시간복잡도

    • for 루프는 n-1 번 반복되고

    • 각각 n-1, n-2, n-3, ... 1번 반복된다.

    • 교환 자체는 역시 상수시간이다.

    • 따라서 n(n-1)/2 -> O(n^2) 가 된다.

Insertion Sort

  • 제일 최초의 데이터는 이미 정렬된 상태로 본다.

  • 두번째 데이터를 넣어줄 때부터 정렬을 신경쓰면서 삽입한다.

  • 삽입 위치를 찾는 방법

    • 뒤에서부터 검사한다면, 앞에 정렬된 데이터를 모두 검사하지 않아도 된다. 따라서 뒤에서부터 검사한다면, 보다 효율적으로 삽입 위치를 찾을 수 있다.

    • 내가 insert 할 값을 임시 변수인 temp 에 저장한다.

    • 이 temp 값을 정렬된 리스트의 맨 마지막 값부터 차례대로 비교한다. 값이 temp보다 크면 뒤로 shift, temp보다 작다면, 해당 index 바로 뒤로 삽입한다.

  • 시간복잡도

    • for 반복 : n-1

    • insert 를 위해 필요한 비교 연산 : 최선의 경우 1번, 최악의 경우 n(n-1)/2 가 소요된다.

    • 결국 시간복잡도는 O(n^2) 가 된다. 비록 다른 selection sort, bubble sort 와 시간 복잡도가 같아보이지만, insertion 정렬의 경우는 이 시간복잡도가 최악의 경우를 의미한다. 따라서 실제로는 이것의 거의 절반정도로 보면 되고, 확실하게 selection, bubble sort 보다는 빠르다는 것을 보장한다.

Last updated