`

Python实现的堆排序

 
阅读更多

堆排序属于选择排序,它其实就是一个建立大顶堆的过程

大顶堆:

ki <= k2i+1 且 ki <= k2i+2; i>=0;ki>=0& ki<=n;

堆排序相较于直接选择排序的优势在于在建堆的过程中,剩余序列元素已经部分有序,剩余部分减少交换次数,节省时间, 本人觉得也有点像冒泡排序(每一次比较后将最大值放到后面).

它的时间复杂度为O(nlogn),空间复杂度为O(1). 不稳定

 

算法思路:

1.i 为最后结点(叶子结点) (i-1)/2或(i-2)/2为它的父结点p,其实是相等的

2.p值小于i值, 交换p 和i

3.p值与另外一个子结点比较,若 p值较小,再交换

4. p= p-1,i = 2* p + 1,重复2-4

5. 若p<0,结束循环

 

import util
class HeapSort:
    def sort(self,arrData):
        for i in range(0,len(arrData)):
            self.buildMaxHeap(arrData,len(arrData) -i);
        return;
    #建立最大堆
    def buildMaxHeap(self,arrData,length):
        #最后的结点
        n = length - 1;
        #最后结点的父结点
        pn = (n-1)//2;
        while pn >=0: #父结点为为根结点后停止
            #("结点[%d]=" % n,arrData[n],",父结点[%d]=" % pn,arrData[pn]);
            if arrData[n] > arrData[pn]:
                util.swap(arrData,n,pn);
            if pn * 2 + 2 == n:
                #n为右结点
                if arrData[n - 1] > arrData[pn]:
                    util.swap(arrData,n-1,pn);
            else:
                #n为左结点
                if n + 1 < length:
                    #("左结点,有右结点为",arrData[n+1]);
                    if arrData[n + 1] > arrData[pn]:
                        util.swap(arrData,n+1,pn);
                #else:
                #("左结点,没有右结点");
            #pn设为pn的兄弟结点或父结点
            pn = pn -1;
            #n设为pn的子结点
            n = pn * 2 +1;
        #0位置为最大值
        #最大值要放到后边
        util.swap(arrData,0,length-1);
        return;

arr = [7,2,5,3,1,8,6,100,48,38,45,20,34,67,12,23,90,58];
#[3, 1, 7, 5, 6, 8, 12, 2];
#[7,2,5,3,1,8,6,100,48,38,45,20,34,67,12,23,90,58];
print(arr);
shellSort = HeapSort();
shellSort.sort(arr);
print(arr);

 

class Util:  
    @classmethod  
    def test():  
        return 0;  
  
  
def swap(arr,x,y):  
    t=arr[x];  
    arr[x]=arr[y];  
    arr[y]=t;

def printArr(arr,len):
    str ='[';
    for i in range(0,len):
        if i == len -1:
            str = str + "%d" % arr[i] ;
        else:
            str = str + "%d" % arr[i] +", ";
    str = str +"]";
    print(str);

 

分享到:
评论

相关推荐

    Python实现堆排序.rar

    本资源“Python实现堆排序.rar”提供了一个用Python语言编写的堆排序实现示例,通过分析这个代码,我们可以深入理解堆排序的工作原理以及如何在Python中实现它。 堆排序是一种基于比较的排序算法,其核心思想是利用...

    堆排序9.py 使用python实现

    堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现...

    堆排序6.py 使用python实现

    堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现...

    应用Java和Python分别实现堆排序算法

    堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和...

    使用 Python 实现堆排序的代码

    heap_sort(arr) 函数:实现堆排序的主函数。首先构建最大堆,然后反复将堆顶元素(最大值)与末尾元素交换并调整堆,直到整个序列有序。 在堆排序中,建堆的时间复杂度为 O(n),每次调整堆的时间复杂度为 O(log n),...

    python实现堆排序.py

    堆排序

    堆排序13.py 使用python代码实现

    堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用...

    Python实现堆排序的方法详解

    本文实例讲述了Python实现堆排序的方法。分享给大家供大家参考,具体如下: 堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是一种原地排序...

    堆排序.py 使用python的代码实现

    堆排序.py 使用python的代码实现堆排序.py 使用python的代码实现堆排序.py 使用python的代码实现堆排序.py 使用python的代码实现堆排序.py 使用python的代码实现堆排序.py 使用python的代码实现堆排序.py 使用python...

    python实现堆排序的实例讲解

    以下是一个Python实现堆排序的例子: ```python from collections import deque def swap_param(L, i, j): L[i], L[j] = L[j], L[i] return L def heap_adjust(L, start, end): temp = L[start] i = start j...

    堆排序python代码.rar

    ### Python实现堆排序 Python的`heapq`模块提供了堆操作,如`heappush()`用于将元素添加到堆中,`heappop()`用于取出并移除堆顶元素。下面是一个使用`heapq`实现堆排序的示例: ```python import heapq def heap_...

    各种排序算法的Python实现

    Python实现堆排序时,可以利用heapq模块,或者手动构建和调整堆。 3. 归并排序(Merge Sort): 归并排序采用分治策略,将待排序序列分为两半,分别进行排序,然后将两个已排序的子序列合并为一个有序序列。归并...

    python 实现堆排序算法代码

    /usr/bin/python import sys def left_child(node): return node * 2 + 1 def right_child(node): return node * 2 + 2 def parent(node): if (node % 2): return (i – 1) / 2 else: return (i – 2) / 2 def max_...

    基于python的堆排序算法设计与实现

    基于python的堆排序算法设计与实现

    完整详细版Python全套教学课件 第05节 树的遍历和堆排序.pptx

    通过Python实现堆排序,我们可以使用内置的`heapq`库,或者自己构建堆结构并实现调整和交换操作。堆排序适用于大数据集,因为它在最坏情况下仍保持良好的性能。 综上所述,Python中的树遍历和堆排序是理解数据结构...

    python-十大排序算法实现之堆排序

    python python_十大排序算法实现之堆排序

    Python3实现堆排序算法(源代码)

    ### Python3实现堆排序算法详解 #### 一、堆排序简介 堆排序是一种高效、比较式的内部排序算法,它的基本思想是将待排序的数据集合构造成一个二叉堆(最大堆或最小堆),然后逐步缩小堆的范围,直到整个序列有序。 ...

    一个简单的python实现的堆排序程序.zip

    一个简单的python实现的堆排序程序,实现了堆排序的全过程,不需要导入任何模块。

Global site tag (gtag.js) - Google Analytics