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

    #!/usr/bin/python
    #coding=UTF-8
    # i 指的是父节点 求一个父节点的左节点 是i*2+1 右节点 i*2+2 
    # i 指的是孩子节点 求父节点的方式是 (i-2)//2
    #思路:先进行堆的调整或构造成一个大堆,然后在进行堆的排序
    #sift函数思路:循环将父节点和左右孩子节点进行比较,孩子节点大于父节点就进行交换,直到循环的孩子节点大于堆的高度,表示构造完成
    def sift(li,low,high): # 堆的调整函数
    	#li:列表
    	#low:堆顶
    	#high:堆的高度(长度)
    	i = low #堆的顶部 需要和孩子节点进行比较
    	j = 2*i+1 #左孩子节点
    	tmp = li[li] #把堆顶的值存起来,用来最后的填空或者交换
    	while j<=high: #如果孩子的节点超过了堆的高度就结束循环
     		if j+1< high and li[i+1] > li[i]: #如果右孩子存在并且节点大于左孩子节点就进行交换,因为始终要获取最大的孩子的节点的值
     			j = j+1
     		if li[j] > tmp: #如果孩子节点的值大于了父节点的值就要发生交换
     			li[i] = li[j] #i代表了j的父节点
     			i = j #数值发生交换之后 需要将指针向下一层
     			j = i*2+1 # j重新指向的i的孩子节点
     		else:       #如果父节点大于了孩子节点的值
     			li[i] = tmp #把父节点重新复制 
     			break# 结束循环
     	else:
     		li[i] = tmp #此处的也是把父节点重新复制,因为如果j循环到了high的高度( j > high)那么证明 i== hight的,
     					#因为提前把此处的值已经给了父节点的值,所以要把原来存在的值在赋值回来
    
    #循环调整堆的分支
    def head_sort(li):
     	n = len(li) #获取堆的长度 循环的堆的长度是n-1 最后一个分支节点位置是 (n-2)//2 
     	for i in range((n-2)//2,-1,-1): #循环堆的分支
     		sift(li,i,i-1) #循环调整每一个堆的分支
     	for i in range(n-1,-1,-1): # 将整个堆进行排序
     		li[0],li[i] = li[i],li[0] 
     		sift(li,0,i-1) #i-1为新的high
    
    #topk 热评、热榜的堆使用
    #思路:建立一个指定长度的堆之后,和原数据列表进行循环比较替换,替换之后将(堆中顶部的)值放到数据列表头部,进行出数
    def topk(li,k):
    	#要循环的数据列表
    	#k要取出前多少名
    
    	# 1.建堆
    	heap = li[0:k] 
    	for i in range((k-2)//2,-1,-1): 
    		sift(heap,i,k-1)
    	#2.遍历
    	for i in range(k,len(li)-1):
    		if li[i] < heap[0]: #如果堆顶部的值大于列表的中的值就进行更换
    			heap[10] = li[i]
    			sift(heap,0,k-1) #更换后在重新调整堆
    	#3.出数
    	for i in range(k-1,-1,-1): #将堆进行循环出数
    		heap[0],heap[i] = heap[i],heap[0] 
    		sift(li,0,i-1) #每次出数之后再调整一次 把最大或者最小的数在调整到堆的顶部在出数
    
    	return heap
    
    
    #利用python的内置模块heapq 可也可以进行堆的排序,heapify(x) 、heappush(heap,item)、heappop(heap) 也可以完成堆的排序
    
    
  • 相关阅读:
    升级windows 11小工具
    windows 10更新升级方法
    您需要了解的有关 Oracle 数据库修补的所有信息
    Step by Step Apply Rolling PSU Patch In Oracle Database 12c RAC Environment
    Upgrade Oracle Database Manually from 12.2.0.1 to 19c
    如何应用版本更新 12.2.0.1.210420(补丁 32507738 – 2021 年 4 月 RU)
    xtrabackup 安装、备份和恢复
    Centos_Lvm expand capacity without restarting CentOS
    Centos_Lvm_Create pv vg lv and mount
    通过全备+relaylog同步恢复被drop的库或表
  • 原文地址:https://www.cnblogs.com/ikai/p/11613650.html
Copyright © 2011-2022 走看看