排序算法——归并排序

1、算法介绍

 归并排序采用分而治之的思想进行排序,需要额外的内存空间。

(1)申请arrRes与未排序序列arr相同内存空间,用于存放归并后的序列

(2)将未排序序列分为两份arrL与arrR,从arrL与arrR分别取出一个元素进行比较,较小的并入arrRes序列,

从并入元素所属的序列取下一个进行比较,直至序列arrL与arrR一方全部并入arrRes,将剩余的一方直接并入arrRes

(3)递归步骤(2),递归结束,归并完成

2、代码实现

2.1、golang

package main

import (
	"fmt"
)

func main() {
	slice := []int{5, 3, 12, 54, 23, 12, 6, 9, 19}
	slice = SortMerge(slice)
	fmt.Println(slice)
}

//归并排序
func SortMerge(slice []int) []int {
	n := len(slice)
	if n < 2 {
		return slice
	}
	middle := n / 2
	left := slice[:middle]
	right := slice[middle:]
	return merge(SortMerge(left), SortMerge(right))
}

//归并元素
func merge(left, right []int) []int {
	var result []int
	for len(left) != 0 && len(right) != 0 {
		if left[0] <= right[0] {
			result = append(result, left[0])
			left = left[1:]
		} else {
			result = append(result, right[0])
			right = right[1:]
		}
	}
	result = append(result, left...)
	result = append(result, right...)
	return result
}

2.2、python3

# 归并排序
def sort_merge(arr):
    n = len(arr)
    if n < 2:
        return arr
    middle = n // 2
    left, right = arr[0:middle], arr[middle:]
    return __merge(sort_merge(left), sort_merge(right))


# 左右归并
def __merge(left, right):
    result = []
    while left and right:
        if left[0] <= right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    return result + left + right


if __name__ == '__main__':
    arr = [5, 3, 12, 54, 23, 12, 6, 9, 19]
    arr = sort_merge(arr)
    print(arr)
笃志:“博学而笃志,切问而近思,仁在其中矣。”
弘毅:“士不可以不弘毅,任重而道远。”
止于至善:“大学之道,在明明德,在亲民,在止于至善。”
关注:笃志弘毅,止于至善
原文地址:https://www.cnblogs.com/dzhy/p/10943535.html