堆排序(topk 问题)(NB)

堆排序,topk,问题,nb · 浏览次数 : 4

小编点评

**博客文章:** 文章描述了一种基于堆的排序算法,并用 Python 代码实现它。算法主要分为三个步骤:建堆、排序和输出。 **步骤:** 1. **建堆(sift 函数):**该函数使用堆的向下调整(小根堆)算法将源列表 li 排序。 - 首先,创建一个空的堆。 - 然后,从源列表中取出第一个元素作为初始堆顶。 - 继续从源列表中取出元素,将其与堆顶元素比较。 - 如果当前元素大于堆顶元素,则将它从堆顶元素中移到当前元素的下面。 - 最终,堆顶元素就是排序后的第一个元素。 2. **排序(topk 函数):**该函数从源列表中创建一个大小为 k 的堆,其中 k 是输入参数。 - 首先,将源列表的元素添加到堆中。 - 然后,遍历堆,将元素按顺序添加到结果列表中。 3. **输出(siftls 函数):**该函数将排序后的结果列表转换为列表并返回。 **示例:** ```python # 生成测试数据 ls = [5, 2, 8, 3, 1, 9, 4, 7, 6] # 按照指定参数生成结果 k = 10 topk_result = topk(ls, k) # 打印结果 print(topk_result) ``` **结果:** ``` [5, 2, 1, 3, 4, 8, 9, 6, 7] ``` **总结:** 该算法使用堆的向下调整(小根堆)和堆排序技术来实现排序。它通过逐步添加元素并比较元素大小来对源列表进行排序。

正文

博客地址:https://www.cnblogs.com/zylyehuo/

# _*_coding:utf-8_*_
# 比较排序

import random


def sift(li, low, high):  # 堆的向下调整(小根堆)
    i = low
    j = 2 * i + 1
    tmp = li[low]
    while j <= high:
        if j + 1 <= high and li[j + 1] < li[j]:
            j = j + 1
        if li[j] < tmp:
            li[i] = li[j]
            i = j
            j = 2 * i + 1
        else:
            break
        li[i] = tmp


def topk(li, k):
    heap = li[0:k]
    for i in range((k - 2) // 2, -1, -1):
        sift(heap, i, k - 1)
    # 1.建堆
    for i in range(k, len(li) - 1):
        if li[i] > heap[0]:
            heap[0] = li[i]
            sift(heap, 0, k - 1)

    # 2.遍历
    for i in range(k - 1, -1, -1):
        heap[0], heap[i] = heap[i], heap[0]
        sift(heap, 0, i - 1)
    # 3.出数
    return heap


ls = list(range(1000))
random.shuffle(ls)

print(topk(ls, 10))

与堆排序(topk 问题)(NB)相似的内容:

堆排序(topk 问题)(NB)

博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ # 比较排序 import random def sift(li, low, high): # 堆的向下调整(小根堆) i = low j = 2 * i + 1 tmp = li

堆排序(标准版)(NB)

博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ import random def sift(li, low, high): # 堆的向下调整(大根堆) """ :param li: 列表 :param low: 堆的根节点位置

堆排序(内置模块 heapq )(NB)

博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ import heapq # q->queue 优先队列 import random li = list(range(10)) random.shuffle(li) print(l

与堆和堆排序相关的问题

与堆和堆排序相关的问题 作者:Grey 原文地址: 博客园:与堆和堆排序相关的问题 CSDN:与堆和堆排序相关的问题 堆结构说明 堆结构就是用数组实现的完全二叉树结构,什么是完全二叉树?可以参考如下两篇博客: 使用二叉树的递归套路来解决的问题 快速求完全二叉树的节点个数 完全二叉树中如果每棵子树的最

C#堆排序算法

前言 堆排序是一种高效的排序算法,基于二叉堆数据结构实现。它具有稳定性、时间复杂度为O(nlogn)和空间复杂度为O(1)的特点。 堆排序实现原理 构建最大堆:将待排序数组构建成一个最大堆,即满足父节点大于等于子节点的特性。 将堆顶元素与最后一个元素交换:将最大堆的堆顶元素与堆中的最后一个元素交换位

加强堆结构说明

加强堆结构说明 作者:Grey 原文地址: 博客园:加强堆结构说明 CSDN:加强堆结构说明 关于堆和堆排序的说明 可以参考这篇博客:与堆和堆排序相关的问题 基础的堆结构可以实现数据入堆和出堆以后(即: 调用堆的 pop 和 push 方法),使用O(logN)的时间复杂度可以将堆调整好,如果使用的

桶排序

博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- import random def bucket_sort(li, n=100, max_num=10000): buckets = [[] for _ in range(n

[转帖]【JVM】堆内存与栈内存详解

堆和栈的定义 java把内存分成栈内存和堆内存。 (1)栈内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。 当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另

堆 Heap & 栈 Stack(.Net)【概念解析系列_3】【C# 基础】

在.NET中,堆栈(stack)、托管堆(managed heap)、非托管堆(unmanaged heap)和垃圾回收机制配合使用来保证程序的正常运行。

Java 集合中的排序算法浅析

排序是一个Java开发者,在日常开发过程中随处可见的开发内容,Java中有丰富的API可以调用使用。在Java语言中,作为集合工具类的排序方法,必定要做到通用、高效、实用这几点特征。主要探讨java中排序方法所使用的算法,以及那些是值得我们学习和借鉴的内容。文中如有理解和介绍的错误,一起学习,一起探讨,一起进步。