堆排序

复制代码
 1 import random
 2 
 3 
 4 def sift(li, low, high):
 5     if low < high:
 6         i = low
 7         j = 2 * i + 1
 8         temp = li[low]
 9         while j <= high:
10             if j+1 <= high and li[j+1] > li[j]:
11                 j += 1
12             if temp < li[j]:
13                 li[i] = li[j]
14                 i = j
15                 j = 2 * i + 1
16             else:
17                 break
18         li[i] = temp
19 
20 
21 def heap_sort(li):
22     # 1.建立堆
23     # 2,堆头放到堆尾
24     tail = len(li) - 1
25     header = 0
26     last_fa = (tail-1) // 2
27     for i in range(last_fa, -1, -1):
28         sift(li, i, tail)
29     for i in range(len(li)):
30         li[header], li[tail] = li[tail], li[header]
31         tail -= 1
32         sift(li, 0, tail)
33 
34 
35 def sift_desc(li, low, high):
36     i = low
37     j = 2 * i + 1
38     temp = li[low]
39     while j <= high:
40         if j+1 <= high and li[j+1] < li[j]:
41             j += 1
42         if temp > li[j]:
43             li[i] = li[j]
44             i = j
45             j = 2 * i + 1
46         else:
47             break
48     li[i] = temp
49 
50 
51 # 前k个元素
52 def topk(li, k):
53     heap = li[:k]
54     tail = k - 1
55     last_fa_k = (tail-1) // 2
56     for i in range(last_fa_k, -1, -1):
57         sift_desc(heap, i, tail)
58     print(heap)
59     for i in range(tail+1, len(li), 1):
60         if li[i] > heap[0]:
61             heap[0] = li[i]
62             sift_desc(heap, 0, tail)
63     for i in range(tail, -1, -1):
64         heap[0], heap[i] = heap[i], heap[0]
65         sift_desc(heap, 0, i-1)
66     print(heap)
67 
68 
69 if __name__ == '__main__':
70     li = [i for i in range(200)]
71     random.shuffle(li)
72     print(li)
73     topk(li, 10)
74     # heap_sort(li)
75     print(li)
复制代码

 

posted @   Avery_rainys  阅读(24)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示