각 턴별로 (데이터 길이 - 턴 번호(zero based) - 1) 번 비교하면, 각턴에 배열 뒤부터 제자리를 맞춰감
각턴을 살펴보면, 각턴 마다 (데이터 길이 - 턴번호 - 1) 만큼의 비교 횟수면 제일큰 숫자, 그다음으로 큰 숫자 ... 순으로 제 자리에 위치하게 됨
한턴에 한번도 정렬이 되지 않았다면 이미 그 턴에 데이터가 잘 위치한 것이므로 빨리 빠져 나올 수 있음
데이터 길이
비교
턴
2
1
1
3
2
2
4
3
3
최대 비교해야 하는 횟수
N = n-1 + n-2 ... + 1
2N = n(n-1)
N = n(n-1)/2
수도 코드 고안
range(0) -> 아무 것도 안함
for turn in range(데이터 길이 - 1): # turn : 0 부터 시작
for comparison in range(데이터 길이 - 1 - turn):
if 앞 데이터 > 뒤 데이터:
swap(앞, 뒤)
코드 고안
한턴에 바꾸는 것이 일어나지 않으면, 바로 나온다는 것도 고려함
def bubblesort(data):
for index in range(len(data) - 1):
swap = False
for index2 in range(len(data) - index - 1):
if data[index2] > data[index2+1]:
data[index2], data[index2+1] = data[index2+1], data[index2]
swap = True
if swap == False:
break
return data
import random
data_list = random.sample(range(100), 50) # sample 함수는 알아서 list로 만들어 줌
bubblesort(data_list)
for stand in range(len(data) -1):
lowest = stand
for index in range(stand + 1, len(data)): # 최솟값을 검색하는 부분에서 서로 비교해서, 최소값의 인덱스 추출 (여기에서는 검색 시작이 0번 부터임)
if data[lowest] > data[index]:
lowest = index
swap(lowest, stand)
코드 고안
def selection_sort(data):
for stand in range(len(data) - 1):
lowest = stand
for index in range(stand + 1, len(data)):
if data[lowest] > data[index]:
lowest = index
data[lowest], data[stand] = data[stand], data[stand]
return data
# TEST
import random
data_list = random.sample(range(100), 10)
selection_sort(data_list)