基本算法——堆排序——python实现

目录

知识积累: 

具体: 

​ 第一步:建堆

第二步:主体

第三步:验证

第四步: 将堆释放

完整代码:


知识积累: 

具体: 

 第一步:建堆

具体思路看注解

我们要大根堆

大的在上面

def sift(li,low,hight):
    '''
    li ; 列表
    low : 根节点的位置
    hight : 堆最后一个元素的位置
    return
    '''

    i = low
    j = 2*i +1
    tem = li[low]  #记录堆顶
    while j <= hight: #只要j位置有数字
        if j+1 <= hight and li[j+1] > li[j]:  #如果右孩子大于左孩子
            j = j + 1 #指向右孩子

        if li[j] > tem: #下一层大于当前的
            li[i] = li[j] #交换值
            i = j #再往下看一层
            j = 2 * i + 1 #重置j
        else:   #tem更大,把tem放在i的位置上
            li[i] = tem
            break
    else:
        li[i] = tem

第二步:主体

从下往上开始找父节点 建堆

 

def heap_sort(li):
    n = len(li)
    #建堆
    for i in range((n-2)//2,-1,-1):
        #i表示建堆的时候调整部分的下标
        sift(li,i,n-1)
        #建堆完成
    print(li)

第三步:验证

li = [i for i in range(100)]
import random
random.shuffle(li)
heap_sort(li)

结果 

第四步: 将堆释放

    for i in range(n-1,-1,-1):
        #i 指向当前堆最后一个元素
        li[0],li[i] = li[i],li[0]
        sift(li,0,i-1)#i-1是新的hight

 

完整代码:

""" 
CSDN : heart_6662
PYTHON amateur   
"""
def sift(li,low,hight):
    '''
    li ; 列表
    low : 根节点的位置
    hight : 堆最后一个元素的位置
    return
    '''

    i = low
    j = 2*i +1
    tem = li[low]  #记录堆顶
    while j <= hight: #只要j位置有数
        if j+1 <= hight and li[j+1] > li[j]:  #如果右孩子大于左孩子
            j = j + 1 #指向右孩子

        if li[j] > tem:
            li[i] = li[j]
            i = j #往下看一层
            j = 2 * i + 1
        else:   #tem更大,把tem放在i的位置上
            li[i] = tem
            break
    else:
        li[i] = tem

def heap_sort(li):
    n = len(li)
    #建堆
    for i in range((n-2)//2,-1,-1):
        #i表示建堆的时候调整部分的下标
        sift(li,i,n-1)
        #建堆完成
        #将堆释放
    for i in range(n-1,-1,-1):
        #i 指向当前堆最后一个元素
        li[0],li[i] = li[i],li[0]
        sift(li,0,i-1)#i-1是新的hight


li = [i for i in range(100)]
import random
random.shuffle(li)
print(li)
heap_sort(li)
print(li)



  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Python 中,你可以使用内置的 `sorted` 函数来对列表进行排序。例如: ```python numbers = [3, 4, 2, 1] sorted_numbers = sorted(numbers) print(sorted_numbers) # 输出: [1, 2, 3, 4] ``` 你也可以使用列表的 `sort` 方法来对列表进行排序。与 `sorted` 函数不同的是,`sort` 方法是在原地对列表进行排序,也就是说不会返回一个新的列表,而是直接修改原来的列表。例如: ```python numbers = [3, 4, 2, 1] numbers.sort() print(numbers) # 输出: [1, 2, 3, 4] ``` 你也可以使用 Python 的 heapq 库中的堆排序算法堆排序是一种速度较快的排序算法,特别适用于海量数据的排序。例如: ```python import heapq numbers = [3, 4, 2, 1] heapq.heapify(numbers) # 将列表转化为堆 sorted_numbers = [] while numbers: sorted_numbers.append(heapq.heappop(numbers)) # 将堆中最小的数取出并放到结果列表中 print(sorted_numbers) # 输出: [1, 2, 3, 4] ``` 此外,Python 还提供了许多其他的排序算法,例如快速排序、归并排序等。你可以使用 Python 的 timeit 库来对不同的排序算法进行测试,以找出最快的排序算法。 ### 回答2: 数据结构是计算机科学中非常重要的一个概念,它是一种组织和存储数据的方式。而实现排序算法是数据结构中的一个重要应用。 在Python中,可以使用多种数据结构来实现排序算法,比如列表、数组和堆等。下面我将介绍一种常用的排序算法——插入排序的Python实现。 插入排序是一种简单且常用的排序算法,它的基本思想是将待排序的元素一个一个地按照大小插入到已经排好序的列表中。具体步骤如下: 1. 创建一个新的空列表,作为存放已排序元素的容器。 2. 遍历待排序的列表,依次取出每个元素。 3. 将取出的元素与已排序元素的最后一个元素比较,如果取出的元素较小,则将它插入到已排序元素的末尾;如果取出的元素较大,则向前比较,找到合适的位置插入。 4. 重复步骤3,直到待排序列表中的所有元素都被取出并插入到已排序列表中。 5. 返回已排序的列表,即为排序结果。 下面是插入排序的Python实现代码: ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr ``` 通过调用`insertion_sort`函数,传入待排序的列表,即可得到排序结果。 这就是数据结构中一种常用排序算法——插入排序的Python实现。当然,除了插入排序,还有许多其他排序算法也可以使用Python实现,比如冒泡排序、快速排序等。每种排序算法都有其特点和适用场景,可以根据具体需求选择合适的排序算法来使用。 ### 回答3: 数据结构是计算机存储、组织和管理数据的方式。在Python中,可以使用不同的数据结构来实现排序算法。 常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、堆排序和归并排序等。 冒泡排序是一种比较简单的排序算法,它重复地交换相邻的元素,直到整个序列有序为止。可以使用列表作为数据结构来实现冒泡排序。 插入排序是一种较为直观的排序算法,它将未排序的元素逐个插入到已排序的部分中,构建有序序列。也可以使用列表实现插入排序。 选择排序是一种简单直观的排序算法,它每次选择未排序部分的最小元素,并将其与未排序部分的最左边元素交换位置。同样可以使用列表来实现选择排序。 快速排序是一种常用的排序算法,它使用分治的思想,将序列分为两个子序列,递归地排序子序列。同样可以使用列表作为数据结构来实现快速排序。 堆排序是一种利用堆的数据结构来进行排序的算法,它通过不断地构建和调整堆来达到排序的目的。可以使用列表来实现堆排序。 归并排序是一种稳定的排序算法,它使用分治的思想,将序列分为两个子序列,递归地排序子序列,然后将两个有序子序列合并为一个有序序列。同样可以使用列表来实现归并排序。 总的来说,Python提供了多种数据结构和算法实现排序操作,根据实际需求和性能要求选择适合的算法和数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heart_6662

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值