Python算法 插入+归并

3.插入排序:
每次考虑一个元素,左边都是排好序的,一个一个往前比,插入到一个位置,前面的元素都比他小
后面的元素都比他大,插入完成,后面元素全部右移一个位置

def insertionsort(s):
	for index in range(1,len(s)):
		while 0<index and s[index]<s[index-1]:
			s[index],s[index-1] = s[index-1],s[index]
		index -= 1
	return s

4.归并排序

         归并排序的实现分为递归实现非递归(迭代)实现。递归实现的归并排序是算法设计中分治策略的典型应用,我们将一个大问题分割成小问题分别解决,然后用所有小问题的答案来解决整个大问题。非递归(迭代)实现的归并排序首先进行是两两归并,然后四四归并,然后是八八归并,一直下去直到归并了整个数组。

def mergeSort(s):
#递归分割
    if len(s)==1:
        return s
    while len(s)>1:
        mid = len(s)//2
        left_half = s[:mid]
        right_half = s[mid:]
        mergeSort(left_half))
        mergeSort(right_half)
    #归并
    i, j, k =0, 0, 0
    while i<len(left_half) and j<len(right_half):
        if left_half[i]>right_half[j]:
            s[k] = right_half[j]
            j += 1
        else:
            s[k] = left_half[i]
            i  += 1
        k += 1
    while i<len(left_half):
        s[k] = left_half[i]
        i += 1
        k += 1
    while j<len(right_half):
        s[k] = right_half[j]
        j += 1
        k += 1
    return s

加强版:

def mergesort(s):
    start = []
    end = []
    while len(s)>1:
        a = min(s)
        b = max(s)
        start.append(a)
        end.append(b)
        s.remove(a)
        s.remove(b)
    if s:
        start.append(s[0])
    end.reverse()
    return (start+end)

参考链接https://github.com/ChinaRush/Python-1

猜你喜欢

转载自blog.csdn.net/JOBbaba/article/details/81489446