array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
# 선택정렬
for i in range(len(array)):
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)
처리되지 않은 데이터를 하나씩 골라 적절한 위치에 삽입
선택정렬에 비해 구현 난이도가 높은 편이지만, 일반적으로 효울적이다.
앞에 있는 데이터가 정렬되어 있다고 가정하고 뒤에 데이터를 정렬해줌
#삽입 정렬
for i in range (1,len(array)): # j 현재 삽입하고자 하는 데이터
for j in range (i,0,-1): # 인덱스 i부터 1까지 -1씩 감소하며 반복
if array[j]<array[j-1]: # 현재 삽입하고자 하는 데이터와 바로 왼쪽 데이터 비교해서 작으면
array[j],array[j-1]=array[j-1],array[j] # 왼쪽 데이터와 바꿈
else: # 크면
break # 그대로
pivot데이터를 5로 정한다.
pivot 데이터를 기준으로 왼쪽부터 큰값7을 선택하고 오른쪽부터는 작은값4을 선택한다.
5 | 7 9 0 3 1 6 2 4 8
둘의 위치를 바꿔준다.
5 | 4 9 0 3 1 6 2 7 8
위의 단계를 반복한다.
5 | 4 9 0 3 1 6 2 7 8
5 | 4 2 0 3 1 6 9 7 8
위치가 엇갈리는 경우
5 4. 0 3 1 6 9 7 8
작은 데이터와 pivot 데이터의 위치를 변경한다.
1 4. 0 3 5 6 9 7 8
pivot 을 중심으로 왼쪽은 모두 작은값 오른쪽은 모두 큰 값
분할(Divide) 된다. partition
1 4 2 0 3 왼쪽 데이터 모음에서 위 과정을 반복한다.
6 9 7 오른쪽 데이터 모음에서 위 과정을 반복한다.
컴퓨터 과학에서 logN 은 보통 밑이 2인 로그라고 한다..!
# 퀵 정렬
def quick_sort(array, start,end):
if start>=end:
return
pivot=start
left=start+1
right=end
while(left<=right): # 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[pivot]=array[right],array[left]
# 재귀적으로 왼쪽 오른쪽 각각 정렬 다시
quick_sort(array,start,right-1)
quick_sort(array,right+1,end)
# 파이썬의 장점을 살린 퀵정렬
def quick_sort2(array):
if len(array)<=1:
return array
pivot =array[0]
tail=array[1:0] # 피봇을 제외한 리스트
left_side=[x for x in tail if x<=pivot]
right_side=[x for x in tail if x>pivot]
return quick_sort2(left_side)+[pivot]+quick_sort2(right_side)
각 원수 개수를 다 구한 뒤 리스트의 첫번째 데이터부터 하나씩 그 값만큼 반복하여 인덱스를 출력
001122345567899
각 데이터 몇번씩 등장햇는지 세고 출력한다.
# 계수 정렬
count=[0]*(max(array)+1)
for i in range (len(array)):
count[array[i]]+=1
for i in range (len(count)):
for j in range (count[i]):
print(i,end='')
어느정도 답이 정해져있기 때문에 외워 푸는 문제이다.
안녕하세요, 김덕우입니다. 정말 꼼꼼히 정리해주셔서 많이 배워갑니다! 제가 지나쳤던 부분들을 상세하게 정리해놓으셨네요!! 어제도 수고하셨습니다, 오늘도 화이팅입니다!