算法笔记 #001# 归并排序

留着备用。

js代码:

            class MergeSort {
                // merge two sorted sequences: arr[start:mid] and arr[mid:end]
                static merge(arr, start, mid, end) {
                    let leftArr = arr.slice(start, mid); // arr[mid] is excluded
                    let rightArr = arr.slice(mid, end); // arr[end] is excluded
                    
                    // put on the buttom of each pile a sentinel 
                    // card, which contains a special value that
                    // we use to simplify our codes
                    let sentinel = Infinity;
                    leftArr.push(sentinel);
                    rightArr.push(sentinel);
                    
                    let i = 0, j = 0; // index of leftArr and rightArr
                    for (let k = start; k < end; ++k) {
                        arr[k] = leftArr[i] < rightArr[j] ? leftArr[i++] : rightArr[j++];
                    }
                }
                
                // sort arr[start:end], arr[end] is excluded
                static sort(arr, start, end) {
                    // calling sort(arr, 0, 1) doesn't make 
                    // sense for there's only one element,
                    // so just stop dividing/recursive and merge directly.
                    if (start + 1 < end) { 
                        // divide the problem into two subproblems
                        let mid = Math.floor((start + end) / 2); 
                        // recursively solve subproblems
                        MergeSort.sort(arr, start, mid);
                        MergeSort.sort(arr, mid, end);
                        // combine the solutions to the subproblems into
                        // the solution for the original problem.
                        MergeSort.merge(arr, start, mid, end);
                    }
                }
                
                
                static run(data) {
                    // convert a string to a numeric array
                    data = CommonUtil.handleData(data); 
                    
                    MergeSort.sort(data, 0, data.length);
                    console.log(data);
                }
            }

Python代码:

def merge(arr, start, mid, end):
    left = arr[start:mid]
    right = arr[mid:end]
    
    sentinel = float('inf')
    left.append(sentinel)
    right.append(sentinel)
    
    i = j = 0
    for k in range(start, end):
        if left[i] < right[j]:
            arr[k] = left[i]
            i += 1
        else:
            arr[k] = right[j]
            j += 1
            
def sort(arr, start, end):
    if start + 1 < end:
        mid = int((start + end) / 2)
        sort(arr, start, mid)
        sort(arr, mid, end)
        merge(arr, start, mid, end)

arr = [1, 3, 5, 2, 12, 3, 22, 88, 23]
sort(arr, 0, len(arr))
print(arr)
            
原文地址:https://www.cnblogs.com/xkxf/p/9692307.html