Python HeapSort

__author__ = ‘student‘
print ‘hello world hello python‘

‘‘‘
heap sort
root  leftchild 2n+1 rightchild 2n+2
compare them and get the maxnode
step by step think way
one step write the perfect program is hard
but it is easy to write your think step by step
build max heap
then swap the biggest number with the size
heap sort is a tuning for selection sort.
‘‘‘
la =[1,5,7,3,20,0,9,4]
print ‘, ‘.join(str(x) for x in la)
#from bottom to top
def heap(la,root,heap_size=None):
    if heap_size is None:
        length=la.__len__()
    else:
        length=heap_size
    lc=root*2+1
    rc=root*2+2
    maxnode=root
    if length>lc and la[lc]>la[root]:
        maxnode=lc
    if length>rc and la[rc]>la[maxnode]:
        maxnode=rc
    if maxnode!=root:
        la[maxnode],la[root]=la[root],la[maxnode]
        heap(la,maxnode,heap_size)

#build max heap
def build_max_heap(la):
    root=la.__len__()/2-1
    while root>=0:
        heap(la,root)
        root-=1
#heap sort
#print ‘,‘.join (str(x) for x in xrange(la.__len__(),0,-1))
build_max_heap(la)

def heap_sort(la):
    heap_size=la.__len__()-1
    for i in xrange(heap_size,0,-1):
        la[i],la[0]=la[0],la[i] #swap
        heap(la,0,heap_size)
        heap_size-=1
        print heap_size,la
    print la
heap_sort(la)

感悟:
学算法千万不能背,不能去抄别人的代码。
首先要去理解整个逻辑,找一个小的数据集,自己推算出其过程,
然后根据这个过程来写代码。
否则抄别人的代码,被别人的思路牵着走,最后容易忘记,还得回头学。
时间: 2024-10-01 02:47:43

Python HeapSort的相关文章

[硕.Love Python] HeapSort(堆排序)

def adjust(a, root, n):     k = a[root-1]     c = root * 2     while c <= n:         if c + 1 <= n and a[c] > a[c-1]:             c += 1         if a[c-1] <= k:             break         a[c/2-1] = a[c-1]         c *= 2     a[c/2-1] = k def he

各种排序算法python和java实现(二)

第一篇博客实现了三种最基本最简单的排序算法,本篇文章将在这三种算法的基础上稍微演变一下. 1.快排 光从名字看就知道速度肯定不差,前一篇讲的冒泡排序,怎么看都不算是一种好的排序算法,里面充斥了太多的无谓的交换动作,时间复杂度倒是很稳定o(n^2),但对于排序算法实在说不过去.快排是冒泡排序的改进版,思路就是分治,将一个序列随机按照某个值分成两个子序列,子序列A里面的值全部比该值大,另一个子序列B的值全部比该值小,这听起来像是二叉排序树.然后依次对子序列进行如上操作,很明显快排最简单的实现就是用递

Heapsort 堆排序算法详解(Java实现)

Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析.同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择对这个算法进行分析主要是因为它用到了一个非常有意思的算法技巧:数据结构 - 堆.而且堆排其实是一个看起来复杂其实并不复杂的排序算法,个人认为heapsort在机器学习中也有重要作用.这里重新详解下关于Heapsort的方方面面,也是为了自己巩固一下这方面知识,有可能和其他的文章有不同的入手点,如有错

algorithm: heap sort in python 算法导论 堆排序

An Python implementation of heap-sort based on the detailed algorithm description in Introduction to Algorithms Third Edition import random def max_heapify(arr, i, length): while True: l, r = i * 2 + 1, i * 2 + 2 largest = l if l < length and arr[l]

python实现堆排序的三种方式

# -*- coding: utf-8 -*- """ Created on Fri May 16 14:57:50 2014 @author: lifeix """ import heapq #堆排序 #第一种实现 def Heapify(a, start, end): left = 0 right = 0 maxv = 0 left = start * 2 right = start * 2 + 1 while left <= end:

八大排序算法---基于python

本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),

Python 实现排序算法

排序算法 下面算法均是使用Python实现: 插入排序 原理:循环一次就移动一次元素到数组中正确的位置,通常使用在长度较小的数组的情况以及作为其它复杂排序算法的一部分,比如mergesort或quicksort.时间复杂度为 O(n2) . # 1nd: 两两交换 def insertion_sort(arr): for i in range(1, len(arr)): j = i while j >= 0 and arr[j-1] > arr[j]: arr[j], arr[j-1] = a

Python学习(三) 八大排序算法的实现(下)

本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全

基本排序算法的Python实现

本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序.希望大家回顾知识的时候也能从我的这篇文章得到帮助. 为了防止误导读者,本文所有概念性内容均截取自对应Wiki 冒泡排序 原理 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢