美文网首页
python堆排序

python堆排序

作者: 修行的修行 | 来源:发表于2021-02-02 16:55 被阅读0次

实现了python的堆排序
利用堆的特性,实现了在10000个数的列表中,找出最小的10个数,并和传统的冒泡排序进行了耗时比较。

from functools import wraps
import time,random
def timeer(name):
    def decorator(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
            start = time.time()
            result = func(*args,**kwargs)
            end = time.time()
            print(name+'耗时:',end-start)
            return result
        return wrapper
    return decorator

class Heap:
    def __init__(self):
        self.__count = 0
        self.__arr = []

    def __len__(self):
        return self.__count

    def __str__(self):
        return  str(self.__arr)

    def insert(self,value):
        self.__arr.append(value)
        self.__count+=1

    def min_t_max(self): #利用大根堆
        for i in range(int((self.__count-1)/2),-1,-1):  #构建大根堆
            self.__build_max_Heap(self.__count,i)
        for i in range(self.__count-1, 0, -1): #不断缩小大根堆范围并维护大根堆
            self.__arr[i], self.__arr[0] = self.__arr[0], self.__arr[i]
            self.__build_max_Heap(i,0)

    def __build_max_Heap(self,n,i): #构建大根堆
        largest = i
        l = 2*i+1
        r = 2*i+2
        if l<n and self.__arr[l]>self.__arr[largest]:
            largest = l
        if r<n and self.__arr[r]>self.__arr[largest]:
            largest = r
        if largest != i:
            self.__arr[i],self.__arr[largest] = self.__arr[largest],self.__arr[i]
            self.__build_max_Heap(n,largest)

    @timeer('堆排序')
    def heap_search_min_n(self,n):   #在list中寻找n个最小的数
        temp = self.__arr.copy()
        self.__arr = temp[0:n] #维护一个n个数的大根堆
        for i in range(int((n-1)/2),-1,-1):
            self.__build_max_Heap(n,i)
        for i in temp[n:]:
            if i<self.__arr[0]:
                self.__arr[0] = i
                for i in range(int((n - 1) / 2), -1, -1):
                    self.__build_max_Heap(n, i)
        minest_list = self.__arr.copy()
        self.__arr = temp
        return minest_list

@timeer('冒泡排序')
def bubble_search_min_n(arr,n):
    count = len(arr)
    for x in range(0,count):
        for y in range(0,count-x-1):
            if arr[y] > arr[y+1]:
                arr[y],arr[y+1]=arr[y+1],arr[y]
    return arr[:n]

#堆排序实现
h = Heap()
for i in range(0,10):
    h.insert(random.randint(0,10))
h.min_t_max()
print('堆排序',h)

#从10000个不相同随机数列表中,挑出10个最小值
heap = Heap()
p = [] #防止重复
number = 10000
for  i in range(0,number):
    temp = random.randint(0,number*10)
    while temp in p:
        temp = random.randint(0,number*10)
    p.append(temp)
    heap.insert(temp)
print('堆排序',heap.heap_search_min_n(10))  #o(n)
print('冒泡排序',bubble_search_min_n(p,10))  #o(n2)

output:
堆排序 [0, 2, 3, 4, 4, 4, 6, 9, 9, 10]
堆排序耗时: 0.0020275115966796875
堆排序 [108, 79, 75, 63, 76, 42, 15, 32, 46, 60]
冒泡排序耗时: 14.59396767616272
冒泡排序 [15, 32, 42, 46, 60, 63, 75, 76, 79, 108]

可以看到,在数据量为10000的情况下,堆排序比冒泡排序快了近万倍

相关文章

  • python实现堆排序(HeapSort)

    python实现【堆排序】(HeapSort) 算法原理及介绍 堆排序(Heapsort)是指利用堆这种数据结构所...

  • 堆排序python

  • Python 堆排序

  • Python 堆排序

  • Python堆排序

  • 堆排序-python

    复习之前学过的堆排序,发现掌握的不是特别牢固,又仔细阅读了几篇博文,整理出来这篇记录。 1 堆排序介绍 1.1 与...

  • python堆排序

    实现了python的堆排序利用堆的特性,实现了在10000个数的列表中,找出最小的10个数,并和传统的冒泡排序进行...

  • 每周一个 Python 模块 | heapq

    专栏地址:每周一个 Python 模块 heapq 实现了适用于 Python 列表的最小堆排序算法。 堆是一个树...

  • 堆排序Python实现

    堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排...

  • python堆排序heapq

    heapq模块实现了一个适用于Python列表的最小堆排序算法。 堆是一种树形数据结构,其中子节点与父节点之间是一...

网友评论

      本文标题:python堆排序

      本文链接:https://www.haomeiwen.com/subject/izkytltx.html