python3에서 내부 병합 정렬 알고리즘을 구현하고 있습니다. 코드는 입력 배열을 취하여 입력 배열의 길이가 둘 이상인 경우 해당 배열을 입력으로 분할하여 반복적으로 호출합니다. 그런 다음 두 개의 정렬 된 배열을 조인합니다. 여기에 코드의 코드를 테스트하는 경우 이제Python : 내부 병합 정렬 구현 문제
def merge_sort(array):
"""
Input : list of values
Note :
It divides input array in two halves, calls itself for the two halves and then merges the two sorted halves.
Returns : sorted list of values
"""
def join_sorted_arrays(array1, array2):
"""
Input : 2 sorted arrays.
Returns : New sorted array
"""
new_array = [] # this array will contain values from both input arrays.
j = 0 # Index to keep track where we have reached in second array
n2 = len(array2)
for i, element in enumerate(array1):
# We will compare current element in array1 to current element in array2, if element in array2 is smaller, append it
# to new array and look at next element in array2. Keep doing this until either array2 is exhausted or an element of
# array2 greater than current element of array1 is found.
while j < n2 and element > array2[j]:
new_array.append(array2[j])
j += 1
new_array.append(element)
# If there are any remaining values in array2, that are bigger than last element in array1, then append those to
# new array.
for i in range(j,n2):
new_array.append(array2[i])
return new_array
n = len(array)
if n == 1:
return array
else:
# print('array1 = {0}, array2 = {1}'.format(array[:int(n/2)], array[int(n/2):]))
array[:int(n/2)] = merge_sort(array[:int(n/2)])
array[int(n/2):] = merge_sort(array[int(n/2):])
# print('array before joining : ',array)
array = join_sorted_arrays(array[:int(n/2)],array[int(n/2):])
# print('array after joining : ',array)
return array
이며,
a = [2,1,4,3,1,2,3,4,2,7,8,10,3,4]
merge_sort(a)
print(a)
out : [1, 1, 2, 2, 3, 3, 4, 2, 3, 4, 4, 7, 8, 10]
위의 함수에서 인쇄 제표의 주석을 경우, 당신은 단지 마지막 그 전에, A = 주어진 출력을 알 수 있습니다 join_sorted_arrays의 호출. 이 함수를 호출 한 후에 배열 'a'를 정렬해야합니다. 놀랍게도, 내가 다음과 같이한다면 출력은 정확합니다.
a = [2,1,4,3,1,2,3,4,2,7,8,10,3,4]
a = merge_sort(a)
print(a)
out : [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 7, 8, 10]
왜 이런 일이 발생하는지 이해하려면 도움이 필요합니다. 초보자이므로 코딩 관행 등에 관한 다른 의견도 환영합니다.
들여 쓰기가 꺼져 있습니다. 고쳐주세요. – Julien
그냥 Google PEP8로 코드/질문을 PEP8에 따라 수정하십시오. –
해결되었습니다. 감사. –