코딩테스트

[Python] 정렬 알고리즘 - 선택, 삽입, 퀵, 계수

ye11 2023. 4. 27. 14:53

1. 선택 정렬 Selection Sort

: 가장 작은 데이터를 선택하여 맨 앞으로 보내고 그 다음 작은 데이터를 선택해서 두번째 데이터와 바꾸는 과정
  시간복잡도 : O(n^2) 많이 느리다

 

a = [7,5,9,0,3,1,6,2,4,8]

for i in range(len(a)):
    min_index = i #비교할 인덱스 0번부터 시작

    for j in range(i+1,len(a)): #그 다음부터 비교 시작
        if a[min_index]>a[j]:
            min_index = j
    
    a[i],a[min_index] = a[min_index],a[i]

print(a)

 

2. 삽입 정렬 Insertion Sort

 

: 맨 첫번째 원소를 기준으로 두번째 원소부터 비교한다. 차례대로 앞에 원소들과 비교하는데 앞에 원소보다 작으면

  자리를 바꾸고 크면 멈춘다.

  시간복잡도 - O(n^2) 

 

a = [7,5,9,0,3,1,6,2,4,8]

for i in range(1,len(a)):

    for j in range(i,0,-1): #앞으로 가면서 비교
        if a[j]<a[j-1]:
            a[j],a[j-1] = a[j-1],a[j]
        
        else :
            break

print(a)

 

3. 퀵 정렬 Quick Sort

: 기준 pivot을 정해 pivot보다 작으면 왼쪽 크면 오른쪽으로 분류. 

  시간복잡도 O(n log n)

def quick_sort(arr):

    if len(arr)<=1:
        return arr

    pivot = arr[0]
    tail = arr[1:]

    left_side = [x for x in tail if x <= pivot]
    right_side = [x for x in tail if x > pivot]

    return quick_sort(left_side)+[pivot]+quick_sort(right_side)

print(quick_sort(a))

 

4. 계수 정렬 (Count Sort)

 

: count에 저장된 데이터 자체가 정렬된 형태 그 자체라고 할 수 있다.

  count 인덱스가 a에 있는 원소라고 보고, a값이 나오는 횟수 라고 보면 된다.

a=[7,5,9,0,3,1,6,2,9,1,4,8,0,5,2]

count = [0]*(len(a)+1)

for i in range(len(a)):
    count[a[i]]+=1

for i in range(len(count)):
    for j in range(count[i]):
        print(i, end =" ") # 0 0 1 1 2 2 3 4 5 5 6 7 8 9 9