zoukankan      html  css  js  c++  java
  • 堆排序

    # 堆排序的向下调整性
    # 排序步骤:建堆 交换堆顶元素和最后一个元素 调整使堆重新有序 i的指向前移(i指向最后一个元素)重复2以后的步骤
    # 交换步骤将堆中的最大元素移动到了堆的最后位置,排序完成后,得到的是一个升序序列
    # 大根堆的排序
    # 向下调整
    def sift(li,low,high):
    	"""
    	:param li:调整的列表
    	:param low:调整的堆的堆顶元素的位置
    	:param high:调整的堆的最后一个叶子节点的位置
    	:return 
    	"""
    	i = low
    	j = 2 * i + 1
    	tmp = li[i]
    	while j<=high:
    		# 判断左右两节点,哪个更大,大的为j
    		j = j+1 if j<high and li[j+1]>li[j] else j
    		# 判断i和j哪个大,大的放到i的位置,i指向当前j的位置,j指向新的i的下一层
    		if tmp<li[j]:
    			li[i] = li[j]
    			i = j
    			j = 2 * i + 1
    		else:
    			break
    	li[i] = tmp
    
    def heap_sort(li):
    	# 建立堆
    	for i in range(len(li)//2-1,-1,-1):
    		sift(li,i,len(li)-1)
    	# 排序
    	for i in range(len(li)-1,-1,-1):
    		li[0],li[i] = li[i],li[0]
    		sift(li,0,i-1)
    
    # 测试
    import random
    li = []
    for i in range(1,100):
    	li.append(i)
    random.shuffle(li)
    print("堆排序前:")
    print(li)
    heap_sort(li)
    print("堆排序后:")
    print(li)
    

      

    堆排序思路可参见:

     https://www.cnblogs.com/chengxiao/p/6129630.html

  • 相关阅读:
    《架构整洁之道》阅读笔记
    设计模式——单例模式
    设计模式——工厂模式使用
    记一次同事安装我自定义一Python3 SDK在window10安装失败情况
    CentOS7常用的一些命令
    Java
    Java
    Java
    Java
    python
  • 原文地址:https://www.cnblogs.com/shannen/p/12947003.html
Copyright © 2011-2022 走看看