Merge Sort

剑指 Offer 51. 数组中的逆序对

方法一:Merge Sort

func reversePairs(nums []int) int {
    n := len(nums)
    temp := make([]int, n)
    return merge_sort(nums, temp, 0, n-1)
}
func merge_sort(A, temp []int, start, end int) int {
    if start >= end {
        return 0
    }
    mid := start + (end - start)>>1
    count := merge_sort(A, temp, start, mid) + merge_sort(A, temp, mid+1, end)
    i, j, k := start, mid+1, 0
    for ; i <= mid && j <= end; k++ {
        if A[i] > A[j] {
            count += mid-i+1
            temp[k] = A[j]
            j++
        } else {
            temp[k] = A[i]
            i++
        }
    }
    for ; i <= mid; i++ {
        temp[k] = A[i]
        k++
    }
    for ; j <= end; j++ {
        temp[k] = A[j]
        k++
    }
    copy(A[start:end+1], temp)
    return count
}

方法二:Merge Sort

func reversePairs(nums []int) int {
    n := len(nums)
    Arr := make([]int, n)
    return merge_sort(nums,Arr, 0, n-1)
}
func merge_sort(A, Arr []int, start, end int) int {
	if start >= end {
		return 0
	}
	mid := start + (end-start)>>1
	left := merge_sort(A, Arr, start, mid)
	right := merge_sort(A, Arr, mid+1, end)
	cross := merge(A, Arr, start, mid, end)
	return left + right + cross
}
func merge(A, Arr []int, start, mid, end int) int {
	p, q, k, count := start, mid+1, 0, 0
	for i := start; i <= end; i++ {
		if p > mid {
			Arr[k] = A[q]
			q++
		} else if q > end {
			Arr[k] = A[p]
			p++
		} else if A[p] <= A[q] {
			Arr[k] = A[p]
			p++
		} else {
			Arr[k] = A[q]
			q++
			count += mid - p + 1
		}
		k++
	}
	for p = 0; p < k; p++ {
		A[start] = Arr[p]
		start++
	}
	return count
}

方法三:Merge Sort

func reversePairs(nums []int) int {
    n := len(nums)
    return merge_sort(nums, 0, n-1)
}
func merge_sort(A []int, start, end int) int {
	if start >= end {
		return 0
	}
	mid := (start + end) >> 1
	left := merge_sort(A, start, mid)
	right := merge_sort(A, mid+1, end)
	cross := merge(A, start, mid, end)
	return left + right + cross
}
func merge(A []int, start, mid, end int) int {
	temp, count := []int{}, 0
	i, j := start, mid+1
	for i <= mid && j <= end {
		if A[i] > A[j] {
			count += mid - i + 1
			temp = append(temp, A[j])
			j++
		} else {
			temp = append(temp, A[i])
			i++
		}
	}
	for ; i <= mid; i++ {
		temp = append(temp, A[i])
	}
	for ; j <= end; j++ {
		temp = append(temp, A[j])
	}
	copy(A[start:end+1], temp)
	return count
}

Merge Sort

注意:fmt.Scanf 将导致 Time limit exceeded

方法一:Merge Sort

package main

import (
	"fmt"
	"os"
	"io/ioutil"
)

func merge_sort(A, temp []int, start, end int) int {
    if start >= end {
        return 0
    }
    mid := start + (end - start)>>1
    count := merge_sort(A, temp, start, mid) + merge_sort(A, temp, mid+1, end)
    i, j, k := start, mid+1, 0
    for ; i <= mid && j <= end; k++ {
        if A[i] > A[j] {
            count += mid-i+1
            temp[k] = A[j]
            j++
        } else {
            temp[k] = A[i]
            i++
        }
    }
    for ; i <= mid; i++ {
        temp[k] = A[i]
        k++
    }
    for ; j <= end; j++ {
        temp[k] = A[j]
        k++
    }
    copy(A[start:end+1], temp)
    return count
}

func main() {
	// var n int
	// fmt.Scanf("%d", &n)
	// A, temp := make([]int, n), make([]int, n)
	// for i := 0; i < n; i++ {
	// 	fmt.Scanf("%d", &A[i]) //fmt.Scanf 将导致 Time limit exceeded
	// }
	var n int
	_, _ = fmt.Scanln(&n)
	b, _ := ioutil.ReadAll(os.Stdin)
	A, temp := make([]int, n), make([]int, n)
	num, i := 0, 0
	for _, by := range b {
		if by == ' ' {
			A[i] = num
			num = 0
			i++
		} else {
			num = num*10 + int(by-'0')
		}
	}
	A[i] = num

	fmt.Println(merge_sort(A, temp, 0, len(A)-1))
}

方法二:Merge Sort

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func merge_sort(A []int, start, end int) int {
	if start >= end {
		return 0
	}
	mid := start + (end - start) >> 1
	left := merge_sort(A, start, mid)
	right := merge_sort(A, mid+1, end)
	cross := merge(A, start, mid, end)
	return left + right + cross
}
func merge(A []int, start, mid, end int) int {
	temp, count := []int{}, 0
	i, j := start, mid+1
	for i <= mid && j <= end {
		if A[i] > A[j] {
			count += mid - i + 1
			temp = append(temp, A[j])
			j++
		} else {
			temp = append(temp, A[i])
			i++
		}
	}
	for ; i <= mid; i++ {
		temp = append(temp, A[i])
	}
	for ; j <= end; j++ {
		temp = append(temp, A[j])
	}
	copy(A[start:end+1], temp)
	return count
}

func main() {
	var n int
	_, _ = fmt.Scanln(&n)
	b, _ := ioutil.ReadAll(os.Stdin)
	A := make([]int, n) //fmt.Scanf 将导致 Time limit exceeded
	num, i := 0, 0
	for _, by := range b {
		if by == ' ' {
			A[i] = num
			num = 0
			i++
		} else {
			num = num*10 + int(by-'0')
		}
	}
	A[i] = num

	fmt.Println(merge_sort(A, 0, n-1))
}

方法三:

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func merge_sort(A, Arr []int, start, end int) int {
	if start >= end {
		return 0
	}
	mid := start + (end-start)>>1
	left := merge_sort(A, Arr, start, mid)
	right := merge_sort(A, Arr, mid+1, end)
	cross := merge(A, Arr, start, mid, end)
	return left + right + cross
}
func merge(A, Arr []int, start, mid, end int) int {
	p, q, k, count := start, mid+1, 0, 0
	for i := start; i <= end; i++ {
		if p > mid {
			Arr[k] = A[q]
			q++
		} else if q > end {
			Arr[k] = A[p]
			p++
		} else if A[p] <= A[q] {
			Arr[k] = A[p]
			p++
		} else {
			Arr[k] = A[q]
			q++
			count += mid - p + 1
		}
		k++
	}
	for p = 0; p < k; p++ {
		A[start] = Arr[p]
		start++
	}
	return count
}

func main() {
	var n int
	_, _ = fmt.Scanln(&n)
	b, _ := ioutil.ReadAll(os.Stdin)
	A, Arr := make([]int, n), make([]int, n)
	num, i := 0, 0
	for _, by := range b {
		if by == ' ' {
			A[i] = num
			num = 0
			i++
		} else {
			num = num*10 + int(by-'0')
		}
	}
	A[i] = num

	fmt.Println(merge_sort(A, Arr, 0, n-1))
}