十大排序算法之七:堆排序(Python)

news/2024/5/19 3:08:25 标签: 算法, 数据结构, 排序算法, 堆排序

一、堆排序简介
二、堆排序步骤
三、代码实现

一、堆排序简介

堆排序是指利用堆这种数据结构所设计的一种排序算法。堆有最大堆和最小堆,在堆排序中: 最大堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排序。 最小堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排序。 堆排序的时间负责度为O(nlogn)

二、堆排序步骤

1、构建堆,本例以最大堆为例,生成升序序列。所以先构建最大堆。 2、删除堆顶元素,把它替换到二叉堆的末尾,调整产生的新的堆顶。 注意:这里并不是真的删除堆顶元素,只是让它和堆的最后一个元素进行交换,下次进行堆的调整时不再包括我们刚刚进行了数据交换的那个位置。

三、代码实现

def heapSort(arr=[]):
    build_heap(arr)
    for i in range(len(arr)-1,0,-1):
        arr[i],arr[0]=arr[0],arr[i]
        down_adjust(0,i,arr)
    return arr

def build_heap(arr):
    '''
    把无序数据构建为一个最大堆
    '''
    for i in range((len(arr)-2)//2,-1,-1):
        down_adjust(i,len(arr),arr)

def down_adjust(parent_index,length,arr=[]):
    temp=arr[parent_index]
    child_index=parent_index*2+1
    while child_index<length:
        if child_index+1<length and arr[child_index]<arr[child_index+1]:
            child_index += 1
        if temp>=arr[child_index]:
            break
        arr[parent_index]=arr[child_index]
        parent_index=child_index
        child_index=2*parent_index+1
    arr[parent_index]=temp

if __name__=='__main__':
    array = [3, 44, 38, 5, 15, 36, 46, 2, 48, 19]
    print(heapSort(array))

在这里插入图片描述


http://www.niftyadmin.cn/n/1714624.html

相关文章

链接过程概述ELF目标文件格式

目录 一、链接过程概述 二、目标文件格式 1.三类目标文件 2.目标文件格式 3.ELF文件格式 4.链接视图 5.执行视图 6.example: ​ 三、可执行文件的存储器映像 一、链接过程概述 1.合并相同的节 2.可执行文件存储器映像&#xff08;磁盘中&虚存中&#xff09; 二…

鸡尾酒排序(Python)

一、鸡尾酒排序简介 二、算法步骤 三、代码实现 一、鸡尾酒排序简介 冒泡排序是每个元素根据自身的大小&#xff0c;一点一点的向数组的一端进行移动&#xff0c;它是一个单向的运动&#xff0c;每一轮都是从左到右来比较元素。 鸡尾酒排序&#xff0c;也是属于冒泡排序的一种…

十大排序算法之八:计数排序(Python)

一、计数排序简介 二、计数排序步骤 三、代码实现 一、计数排序简介 计数排序是将序列中的数值转化为数组的下标&#xff0c;当数字a出现一次时&#xff0c;就把数组中对应a下标的值加1。这些数据需要存放在额外开辟的数组空间中&#xff0c;计数排序的时间复杂度为线性的&am…

装载问题(分支限界法)

装载问题&#xff08;分支限界法&#xff09; 问题定义&#xff1a; 有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船&#xff0c;其中集装箱i的重量为w&#xff0c;且Ew≤c1c2装载问题要求确定是否有一个合理的装载方案&#xff0c;可将这n个集装箱装E这2艘轮船。如果有&…

计数排序的优化

一、计数排序 计数排序是将序列中的数值转化为数组的下标&#xff0c;当数字a出现一次时&#xff0c;就把数组中对应a下标的值加1。这些数据需要存放在额外开辟的数组空间中(我们把该数组成为统计数组)&#xff0c;计数排序的时间复杂度为线性的&#xff0c;它适用于在一定范围…

important tips

define the topic at first, if you have another totally different point to overturn the previous one, remember to refer to it in the end. 立两个不同的论点的话&#xff0c;要在最后总结分析。 Every point should be grounded on specific examples 下得了地 Concl…

多线程游戏

1.程序、进程、线程 ①程序 存在硬盘里面的文件&#xff0c;固定文件&#xff0c;包含&#xff08;代码&#xff0c;素材&#xff0c;配置文件……&#xff09; ②进程 一个程序从载入内存&#xff0c;进程启动&#xff0c;运行&#xff0c;到结束 运行/使用中的程序 ③线…

十大排序算法之九:桶排序

一、桶排序简介 桶排序是计数排序的升级版&#xff0c;它利用了函数的映射关系&#xff0c;高效与否的关键在于这个映射函数的确定。为了使桶排序更加高效&#xff0c;我们需要做到两点&#xff1a; 1、在额外空间充足的情况下&#xff0c;尽量增大桶的数量 2、使用的映射函数能…