input = [4, 6, 2, 9, 1]
# 42619 24169 21469 12469
def bubble_sort(array):
for i in range(len(array) - 1):
for j in range(len(array) - i - 1):
if array[j] > array[j + 1]:
array[j], array[j+1] = array[j+1], array[j]
print(j)
return array
bubble_sort(input)
print(input)
-> 1
3
0
2
1
0
[1, 2, 4, 6, 9]
input = [4, 6, 2, 9, 1]
# 0 1 2 3 4
# 16294 - 12694 - 12496 - 12469
def selection_sort(array):
n = len(array)
for i in range(n-1): # i = 0, array[0] = 4
min_ind = i
for j in range(n-i):
if array[i + j] < array[min_ind]: # array[2] = 2 < 4 = array[0] array[4] = 1 < 2 = array[2]
min_ind = i + j # min_index = 2 min_ind = 4
array[i], array[min_ind] = array[min_ind], array[i] # [1, 6, 2, 9, 4]
return array
selection_sort(input)
print(input) # [1, 2, 4, 6, 9]
input = [4, 6, 2, 9, 1]
# 46 비교 - 462 비교 - 2469 비교 - 24691 비교
# 처음 4는 정렬되어있다고 생각
def insertion_sort(array):
n = len(array)
for i in range(1, n):
for j in range(i):
if array[i-j-1] > array[i-j]:
array[i-j-1], array[i-j] = array[i-j], array[i-j-1]
else:
break
return
insertion_sort(input)
print(input) # [1, 2, 4, 6, 9]
병합(merge)
array_a = [1, 2, 3, 5]
array_b = [4, 6, 7, 8]
def merge(array1, array2):
result = []
array1_index = 0
array2_index = 0
while array1_index < len(array1) and array2_index < len(array2):
if array1[array1_index] < array2[array2_index]:
result.append(array1[array1_index])
array1_index += 1
else:
result.append(array2[array2_index])
array2_index += 1
if array1_index == len(array1): # array1의 원소가 모두 추가되면 나머지 array2
while array2_index < len(array2):
result.append(array2[array2_index])
array2_index += 1
if array2_index == len(array2):
while array1_index < len(array1):
result.append(array1[array1_index])
array1_index += 1
return result
print(merge(array_a, array_b))
분할 정복(Divide and Conquer)
MergeSort(시작점, 끝점) 이라 하자
MergeSort(0, N) = Merge(MergeSort(0, N/2) + MergeSort(N/2, N))
이런식으로 해결 가능
array_a = [1, 2, 3, 5]
array_b = [4, 6, 7, 8]
def merge_sort(array):
if len(array) <= 1:
return array
mid = (0 + len(array)) // 2
left_array = merge_sort(array[:mid])
right_array = merge_sort(array[mid:])
return merge(left_array, right_array)
def merge(array1, array2):
result = []
array1_index = 0
array2_index = 0
while array1_index < len(array1) and array2_index < len(array2):
if array1[array1_index] < array2[array2_index]:
result.append(array1[array1_index])
array1_index += 1
else:
result.append(array2[array2_index])
array2_index += 1
if array1_index == len(array1):
while array2_index < len(array2):
result.append(array2[array2_index])
array2_index += 1
if array2_index == len(array2):
while array1_index < len(array1):
result.append(array1[array1_index])
array1_index += 1
return result
print(merge(array_a, array_b))