<이것이 취업을 위한 코딩테스트다>를 공부하며 정리한 내용입니다.
데이터를 특정한 기준에 따라서 순서대로 나열하는 것
N(데이터의 개수)=10인 경우.
초기 단계 : 모든 데이터가 정렬되어 있지 않으므로, 전체 중에서 가장 작은 데이터를 선택한다. 그리고 가장 앞에 있는 7과 자리를 바꿔준다.
7 5 9 0 3 1 6 2 4 8
정렬된 첫 번째는 제외하고 이후 데이터 중에서 가장 작은 데이터인 ‘1’을 선택해서 처리하지 않은 데이터 중 가장 앞에 있는 5와 바꾼다.
0 5 9 7 3 1 6 2 4 8
2와 9 바꾸기
0 1 9 7 3 5 6 2 4 8
0 1 2 7 3 5 6 9 4 8
0 1 2 3 7 5 6 9 4 8
0 1 2 3 4 5 6 9 7 8
0 1 2 3 4 5 6 9 7 8
0 1 2 3 4 5 6 9 7 8
0 1 2 3 4 5 6 7 9 8
0 1 2 3 4 5 6 7 8 9
⇒ 총 9번(N-1번)만 반복하면 정렬이 완료됨!
array=[7,5,9,0,3,1,6,2,4,8]
for i in range(len(array)-1):
min_index=i #가장 작은 원소의 인덱스
for j in range(i+1,len(array)):
if array[min_index]>array[j]:
min_index=j
array[i], array[min_index]= array[min_index],array[i]
print(array)
N=10, [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
array=[7,5,9,0,3,1,6,2,4,8]
for i in range(1,len(array)):
for j in range(i,0,-1): #i(타깃)에서 1까지 거꾸로 내려가면서 앞에꺼랑 비교함.
if array[j]<array[j-1]: #내가 앞에꺼보다 작으면
array[j], array[j-1]=array[j-1],array[j] #나랑 자리 바꾸자
else: #앞에꺼가 더 크면
break #거기가 니 자리
print(array)
N=10, array=[5,7,9,0,3,1,6,2,4,8]
(직접 필기로 계산해보는 것을 추천!!)
array=[5,7,9,0,3,1,6,2,4,8]
def quick_sort(array,start,end):
if start>=end: #원소가 1개밖에 없는 경우
return
pivot=start
left=start+1
right=end
while left<=right: #같은 피봇일 동안 엇갈리지 않는이상 반복실행
#왼쪽에서부터 피봇보다 큰 값 찾기
while left<=end and array[left]<=array[pivot]:
left+=1
#오른쪽에서부터 피봇보다 작은 값 찾기
while right>start and array[right]>=array[pivot]:
right-=1
#만약 엇갈렸다면 작은 값과 피봇을 바꾸기
if left>right:
array[right], array[pivot]=array[pivot], array[right]
else: #아니라면 작은값과 큰값 자리 바꾸기
array[left],array[right]=array[right], array[left]
#피봇 왼쪽과 오른쪽 분할하여 똑같이 실행해주
quick_sort(array, start, right-1)
quick_sort(array, right+1, end)
quick_sort(array,0,len(array)-1)
print(array)
array=[5,7,9,0,3,1,6,2,4,8]
def quick_sort(array):
#리스트가 하나 이하의 원소만을 담고 있다면 종료
if len(array) <=1:
return array
pivot=array[0] #피봇은 첫 번째 원소
tail=array[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(array))
데이터: 7 5 9 0 3 1 6 2 9 1 4 8 0 5 2 (0~9)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
(생략)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
2 | 2 | 1 | 1 | 1 | 2 | 1 | 1 | 1 | 2 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
2 | 2 | 2 | 1 | 1 | 2 | 1 | 1 | 1 | 2 |
⇒ 0 0 1 1 2 2 3 4 5 5 6 7 8 9 9
#모든 원소의 값이 0보다 크거나 같다고 가정
array=[7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2]
#모든 범위를 포함하는 리스트 선언(모든 값은 0으로 초기화)
count=[0]*(max(array)+1)
for i in array:
count[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