排序3(希尔排序、插入排序、冒泡排序,堆排序)_python

1.希尔排序
希尔排序是间隔一个递减数列的数据比如说{8,4,2,1}中的一个数比较大小,满足条件就交换位置。

def shell_sort(text):
    n = len(text)
    x= n // 2
    while x>= 1:
        for j in range(x,n):
            i = j
            while(i - x) >= 0:
                if text[i] < text[i-x]:
                    text[i-x],text[i] = text[i],text[i-x]
                    i -= x
                else:
                    break
        x//=2 #间隔递减
    return text

2.插入排序

插入排序构建一个有序序列,把未排序序列中的数字,在已排序序列从后往前比较大小,更换位置。

def insert_sort(nums):
	if len(nums)<2:
		return nums
	for i in range(len(nums)):
		index = i-1
		mid = nums[i]
		while index >= 0 and nums[index] > mid:
			nums[index+1] = nums[index]
			index -= 1
		nums[index+1] = mid
	return nums

3.冒泡排序
冒泡排序是遍历len(nums)遍数组,每次遍历将两个顺序不对的元素调换位置

def bubble_sort(nums):
    for i in range(1,len(nums)):
        for j in range(len(nums)-1-i):
            # print(nums)
            if nums[j] > nums[j+1]:
                nums[j],nums[j+1] = nums[j+1],nums[j]

    return nums

4.堆排序
堆排序先建立一个堆,将数据自顶向下填入堆调整为大根堆(父节点大于左右子节点),然后从右至左开始将最小子节点与根节点调换,因为是大根堆所以根节点一定是最大值,然后每次都将未排序的树调整成大根堆,所以每次根节点调换是都是最大值放到了当前最靠近右边子节点的位置。
具体可以看,超级详细——菜鸟教程堆排序
在这里插入图片描述

def heap_sort(nums):
    def adjust_heap(nums, root, numsize):
     pos = root
     left = pos * 2 + 1
     right = left + 1
     if left < numsize:
         if nums[pos] < nums[left]:
             pos = left
     if right < numsize:
         if nums[pos] < nums[right]:
             pos = right
     if pos != root:
             nums[pos], nums[root] = nums[root], nums[pos]
             adjust_heap(nums, pos, numsize)

    n = len(nums)
    for i in reversed(range(n // 2)):
        adjust_heap(nums, i, n)
    print(nums)
    # 调整堆
    for i in range(n - 1, -1, -1):
        nums[0], nums[i] = nums[i], nums[0]
        adjust_heap(nums, 0, i)
    return nums

2020.07.06更新————————————————
从大佬这里翻到一个打印树的牛批代码__传送门

def print_tree(array): #打印堆排序使用
    '''
    深度 前空格 元素间空格
    1     7       0
    2     3       7
    3     1       3
    4     0       1
    '''
    # first=[0]
    # first.extend(array)
    # array=first
    index = 0
    depth = math.ceil(math.log2(len(array))) # 因为补0了,不然应该是math.ceil(math.log2(len(array)+1))
    sep = '  '
    for i in range(depth):
        offset = 2 ** i
        print(sep * (2 ** (depth - i - 1) - 1), end='')
        line = array[index:index + offset]
        for j, x in enumerate(line):
            print("{:>{}}".format(x, len(sep)), end='')
            interval = 0 if i == 0 else 2 ** (depth - i) - 1
            if j < len(line) - 1:
                print(sep * interval, end='')
        index += offset
        print()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值