* 정렬 알고리즘 *
1. 선택정렬
2. 삽입정렬
3. 병합정렬
4. 퀵정렬
1. 선택정렬
가장 작은 값을 골라 정렬 앞쪽에 두는 것을 반복하는 정렬이다.
입력값=[5,10,66,77,54,32,11,15] 정렬된리스트=[] while 입력값: 정렬된리스트.append(min(입력값)) 입력값.pop(입력값.index(min(입력값))) print(정렬된리스트) #최솟값 구하는 함수 만들기 def 최솟값(array): 최소=array[0] cnt=0 for i in array: if 최소>i: 최소=i index=cnt cnt+=1 print(최소) print=("최솟값의 idx",index)
2. 삽입정렬
앞에서부터 차례대로 넣는데, 넣을 때 이 값보다 크게 되면 뒤에 놓고
이 값보다 작게 되면 앞에 놓는 정렬이다.
입력값=[5,10,66,77,54,32,11,15] 정렬된리스트=[] def 삽입값이들어갈인덱스(정렬된리스트,삽입값): for i in range(len(정렬된리스트)): if 삽입값<정렬된리스트[i]: return i return len(정렬된리스트) while 입력값: 삽입값=입력값.pop(0) 인덱스= 삽입값이들어갈인덱스(정렬된리스트,삽입값) 정렬된리스트.insert(인덱스,삽입값)
3. 병합정렬
: 리스트를 각각 모두 나눈 뒤 하나씩 합쳐나가는 정렬
# O(nlogn) > 병합정렬이 시간복잡도가 가장 좋다 # 재귀함수 사용 입력값 = [5, 10, 66, 77, 54, 32, 11, 15] 정렬된리스트 = [] 전체인덱스 = 7 중간값 = 7 // 2 # 3 입력값[:중간값 + 1] 입력값[중간값 + 1:] def 병합정렬(입력리스트): # 분할 파트 입력리스트의길이 = len(입력리스트) 결과값=[] if 입력리스트의길이 <= 1: return 입력리스트 중간값 = 입력리스트의길이 // 2 그룹_하나 = 병합정렬(입력리스트[:중간값]) 그룹_둘 = 병합정렬(입력리스트[중간값:]) # 정복 파트 while 그룹_하나 and 그룹_둘: if 그룹_하나[0] < 그룹_둘[0]: 결과값.append(그룹_하나.pop(0)) else: 결과값.append(그룹_둘.pop(0)) while 그룹_하나: 결과값.append(그룹_하나.pop(0)) while 그룹_둘: 결과값.append(그룹_둘.pop(0)) return 결과값 print(병합정렬(입력값))
4. 퀵정렬
# O(nlogn) > 퀵정렬 (best) # 0(n**2) > 퀵정렬 (worst) # 피봇 pivot 입력값 = [66, 77, 54, 32, 10, 5, 11, 15] def 퀵정렬(입력리스트): 입력리스트의길이 = len(입력리스트) if 입력리스트의길이 <= 1: return 입력리스트 피벗값 = 입력리스트.pop(0) 그룹하나 = [] 그룹둘 = [] for i in range(입력리스트의길이 - 1): if 입력리스트[i] < 피벗값: 그룹하나.append(입력리스트[i]) else: 그룹둘.append(입력리스트[i]) return 퀵정렬(그룹하나) + [피벗값] + 퀵정렬(그룹둘) print(퀵정렬(입력값))
'여니의 Side Project > 제주코딩베이스캠프 서포터즈 2기' 카테고리의 다른 글
[제주코딩베이스캠프] 눈떠보니 코딩테스트 전날 | 트리와 그래프 (0) | 2021.09.01 |
---|---|
[제주코딩베이스캠프 굿즈] 2번째 선물, 키홀더!! (0) | 2021.08.27 |
[제주코딩베이스캠프] 눈떠보니 코딩테스트 전날 | 재귀함수_보강예제 (0) | 2021.08.06 |
[제주코딩베이스캠프] 눈떠보니 코딩테스트 전날 | 재귀함수3 (0) | 2021.08.04 |
[제주코딩베이스캠프] 눈떠보니 코딩테스트 전날 | 재귀함수2 (0) | 2021.08.03 |