归并排序

62 阅读1分钟

分 治

func mergeSort(arr []int, i, j int) {
	if i >= j {
    	return
    }
    mid := i + (j - i) >> 1
    mergeSort(arr, i, mid)
    mergeSort(arr, mid + 1, j)
    merge(arr, i, mid, j)
}
func merge(arr []int, i, mid, j int) {
	tmp := make([]int, j - i + 1)
    left := i
    right := mid + 1
    k := 0
    for left <= mid && right <= j {
    	if arr[left] < arr[right] {
        	tmp[k] = arr[left]
            left++
        } else {
        	tmp[k] = arr[right]
            right++
        }
        k++
    }
    for ; left <= mid; left++ {
    	tmp[k] = arr[left]
        k++
    }
    for ; right <= j; right++ {
    	tmp[k] = arr[right]
        k++
    }
    for k := 0; k < len(tmp); k++ {
    	arr[i+k] = tmp[k]
    }
}