분할 정복의 접근 방식은 아래와 같다:
병합 정렬에 이상의 접근 방식을 적용하면:
이를 바탕으로 간단하게 의사 코드를 작성하면:
병합 정렬(배열) {
만약 배열 길이가 2보다 작을 경우 {
(길이가 1인 배열은 사실상 정렬된 상태이므로) 입력된 배열을 그대로 반환
} 그렇지 않을 경우 {
좌측 배열에 0부터 mid까지를 복사
우측 배열에 mid + 1부터 배열의 끝까지를 복사
병합 정렬(좌측 배열)
병합 정렬(우측 배열)
좌측 배열과 우측 배열을 합친 결과물을 반환
}
}
fn mergesort(vec: &Vec<i32>) -> Vec<i32> {
if vec.len() < 2 {
// 배열 크기가 1이면, 그대로 반환
// 입력은 &Vec<i32>로 받았는데 반환형이 참조 변수가 아니므로,
// to_vec() 메소드를 통해 &Vec<i32>를 Vec<i32>로 변환해서 반환한다
vec.to_vec()
} else {
// 배열 크기가 2 이상일 경우
// 배열을 2개로 나누고 각각 정렬 후 병합해서 반환
let mid = vec.len() / 2;
let left = mergesort(&vec[0..mid].to_vec());
let right = mergesort(&vec[mid..].to_vec());
merge(&left, &right)
}
}
fn merge(left: &Vec<i32>, right: &Vec<i32>) -> Vec<i32> {
let mut temp: Vec<i32> = Vec::new();
let mut left_counter = 0;
let mut right_counter = 0;
// 배열의 첫 번째 원소를 비교해가며, 작은 숫자부터 반환할 벡터에 집어넣음
while left_counter < left.len() && right_counter < right.len() {
if left[left_counter] < right[right_counter] {
temp.push(left[left_counter]);
left_counter += 1;
} else {
temp.push(right[right_counter]);
right_counter += 1;
}
}
// 좌측 배열에만 숫자가 남아있을 경우
if left_counter < left.len() {
while left_counter < left.len() {
temp.push(left[left_counter]);
left_counter += 1;
}
}
// 우측 배열에만 숫자가 남아있을 경우
if right_counter < right.len() {
while right_counter < right.len() {
temp.push(right[right_counter]);
right_counter += 1;
}
}
// 병합된 배열을 반환
temp
}
+=
연산자 정도?first()
메소드를 쓰려고 보니, 반환형이 Option
이더라. 아직 Option
을 다룰 줄 몰라서(예외 처리?를 할 줄 몰라서) 최종적으로 여기서 막혔다. 그래서 구글링으로 위 링크를 참고하게 됨...def mergesort_sort(arr: list) -> list:
if (len(arr) < 2):
return arr
else:
mid = len(arr) // 2
left = mergesort_sort(arr[0:mid])
right = mergesort_sort(arr[mid:])
return mergesort_merge(left, right)
def mergesort_merge(arr1: list, arr2: list):
temp = []
while (len(arr1) and len(arr2)):
if (arr1[0] < arr2[0]): temp.append(arr1.pop(0))
else: temp.append(arr2.pop(0))
if (len(arr1)): temp.extend(arr1)
if (len(arr2)): temp.extend(arr2)
return temp
if __name__ == "__main__":
arr = [15, 22, 13, 27, 12, 10, 20, 25]
print(mergesort_sort(arr))