import time
start_time = time.clock() list_ = [9, 2, 7, 4, 5, 6, 3, 8, 1] """
# 堆排序(通过不断的构造最大堆来选出序列的最大值放到末尾)
# 最大堆调整:将堆的末端子节点调整,使得子节点永远小于父节点。
# 建立最大堆:将堆所有数据重新排序。
# 堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算。
import random def max_heapify(heap, heapsize, root):
# 最大堆调整
left = 2 * root + 1
right = left + 1
larger = root
if left < heapsize and heap[larger] < heap[left]:
larger = left
if right < heapsize and heap[larger] < heap[right]:
larger = right
if larger != root:
heap[larger], heap[root] = heap[root], heap[larger]
max_heapify(heap, heapsize, larger) def build_max_heap(heap):
# 构造一个堆,将堆中所有数据重新排序
heapsize = len(heap)
for i in range((heapsize - 2) // 2, -1, -1):
max_heapify(heap, heapsize, i) def heapsort(heap):
# 将根节点去除与最后一位做对调,对前面len-1个节点继续进行对调整过程。
build_max_heap(heap)
for i in range(len(heap) - 1, -1, -1):
heap[0], heap[i] = heap[i], heap[0]
max_heapify(heap, i, 0)
return heap if __name__ == '__main__':
a = [30, 50, 57, 77, 62, 78, 94, 80, 84]
print(a)
heapsort(a)
print(a)
# b = [random.randint(1, 1000) for i in range(1000)]
# print(b)
# heapsort(b)
# print(b)
# -------------------------------------------------------------- # 归并排序
# 首先用分割的方法将这个序列分割成一个个已经排好序的子序列,然后
# 再利用归并的方法将一个个的子序列合并成排序号的序列
def merge(left, right):
result = []
while left and right:
result.append(left.pop(0)) if left[0] < right[0] else result.append(right.pop(0))
while left:
result.append(left.pop(0))
while right:
result.append(right.pop(0))
return result def mergesort(l):
if len(l) < 2:
return l
mid_index = len(l) // 2
left = mergesort(l[:mid_index])
right = mergesort(l[mid_index:])
return merge(left, right) print(mergesort(list_))
# -------------------------------------------------------------- # 希尔排序 将序列分割成若干子序列(由相隔某个增量的元素组成的)分别进行直接插入排序接着依次缩小增量继续进行排序,待整个序列基本有序时,再对全体元素进行插入排序。
def shell_sort(l):
n = len(l)
gap = n // 2
while gap > 0:
for i in range(gap, n):
temp = l[i] # 每个步长进行插入排序
j = i
# 插入排序
while j >= gap and l[j - gap] > temp:
l[j] = l[j - gap]
j -= gap
l[j] = temp
gap = gap // 2
return l print(shell_sort(list_))
# -------------------------------------------------------------- # 插入排序
# 从索引1开始,一次与其左边的数相比较,若比自己大则插入并删除自己。
def insertsort(l):
len_ = len(l)
for i in range(1, len_):
for j in range(i):
if l[j] > l[i]:
l.insert(j, l[i])
l.pop(i+1)
break
return l print(insertsort(list_))
# -------------------------------------------------------------- # 快速排序
# 选定一个基数如第一个元素
# 将比基数小的和比基数大的元素分别放在新列表里并按顺序排列相加
# 递归直到新列表元素只有一个
def quicksort(l):
len_ = len(l)
if len_ < 2:
return l
else:
pivot = l[0]
less = [i for i in l[1:] if i <= pivot]
greater = [j for j in l[1:] if j > pivot]
print(less, greater)
return quicksort(less) + [pivot] + quicksort(greater) print(quicksort(list_))
# -------------------------------------------------------------- # 选择排序
# 将第一个数与右边数的最小值相比较,若本身较大则与最小值调换位置
# 依次遍历即可
def selectsort(l):
len_ = len(l)
for i in range(len_ - 1):
for j in range(i+1, len_):
min_ = min(l[j:])
min_index = l.index(min_)
if l[i] > min_:
l[i], l[min_index] = l[min_index], l[i]
return l
# 上述选择排序代码存在问题,这次复习自己重写时发现对重复数字处理不对,同时循环也有问题。以下是更改后代码:
def selectsort(l):
length = len(l)
for i in range(length-1):
m = min(l[i+1:]) # 当前数字右边的数字列表中的最小数
j = l[i+1:].index(m) + i + 1 # m的索引,防止重复数字的干扰
if l[i] > m:
l[i], l[j] = l[j], l[i]
return l
 print(selectsort(list_))
# -------------------------------------------------------------- # 冒泡排序
# 从索引0开始依次本身和右边的元素,若右边小则调换位置,来取得最大值
# 然后依次循环把较大的轮换到右边
def bubblesort(l):
len_ = len(l)
for i in range(len_ - 1):
for j in range(len_ - i - 1):
if l[j] > l[j+1]:
l[j], l[j+1] = l[j+1], l[j]
return l print(bubblesort(list_))
""" end_time = time.clock()
print(end_time - start_time)

目前对于堆排序还不太理解,以备后续重温复习。

python 实现经典算法的更多相关文章

  1. python每日经典算法题5(基础题)+1(中难题)

    现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级 ...

  2. python每日经典算法题5(基础题)+1(较难题)

    一:基础算法题5道 1.阿姆斯特朗数 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数.判断用户输入的数字是否为阿姆斯特朗数. (1)题目分析:这里要先得到该数是多少位的,然后再把 ...

  3. python实现经典算法

    1,快速排序 题目形式:手写一下快速排序算法. 题目难度:中等. 出现概率:约50%.手写快排绝对是手撕代码面试题中的百兽之王,掌握了它就是送分题,没有掌握它就是送命题. 参考代码: def quic ...

  4. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  5. 机器学习经典算法具体解释及Python实现--线性回归(Linear Regression)算法

    (一)认识回归 回归是统计学中最有力的工具之中的一个. 机器学习监督学习算法分为分类算法和回归算法两种,事实上就是依据类别标签分布类型为离散型.连续性而定义的. 顾名思义.分类算法用于离散型分布预測, ...

  6. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  7. python数据结构与算法——归并排序

    归并排序: 原理与C语言实现 参考:白话经典算法系列之五 归并排序的实现 1. 容易对有序数组A,B进行排序. 2. 为了使得A,B组内数据有序:可以将A,B组各自再分成二组. 3. 经过不断分组,当 ...

  8. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

  9. Python数据结构与算法--算法分析

    在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...

随机推荐

  1. [转]如何像Python高手(Pythonista)一样编程

    本文转自:http://xianglong.me/article/how-to-code-like-a-pythonista-idiomatic-python 最近在网上看到一篇介绍Pythonic编 ...

  2. 【Kth Smallest Element in a BST 】cpp

    题目: Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. ...

  3. 如何将自己写的代码上传到github上

    忙活了一下午终于成功把代码上传到github上. 接下来就是我上传代码的步骤: ①首先注册github账号,登录,创建新仓库 ,点击+,点击new repository 得到如下页面,填写仓库名,自己 ...

  4. sshd_config_for_centos

    # $OpenBSD: sshd_config,v // :: djm Exp $ # This is the sshd server system-wide configuration file. ...

  5. Linux网卡驱动程序对ethtool的支持和实现

    Linux 的一个显著特点就是其强大的网络功能,Linux 几乎支持所有的网络协议,并在这些协议基础上提供了丰富的应用.对 Linux 网络管理的重要性不言而喻,这些管理依赖于网络工具,比如最常用的 ...

  6. poj2388 更水

    Who's in the Middle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34974   Accepted: 2 ...

  7. npm & npm config

    npm command show npm config https://docs.npmjs.com/cli/config https://docs.npmjs.com/cli/ls https:// ...

  8. Linux命令 -文件操作类

    声明:本文所涉及到的Linux命令均为最常见的用法,未列举之参数,自行查阅man 1.ls    查看文件与目录 -a 打印全部的文件,包括隐藏文件 -l 列表打印,数据项包括文件属性,大小和权限等 ...

  9. let与const区别

    let 1. let有变量提升,但是有约束 2. 会形成暂时性死区(TDZ) 3. 同一个块级作用域内不允许声明相同变量 4. 块级变量 5. let声明的全局变量不是全局对象的属性,var会 6. ...

  10. angular.extend(dst,src)的简单示例

    自我认为这个方法跟angular.copy(src,dst)有点相似.在angular.extend({},src)时,就可以画等号.这个src只代表一个对象.代码如下:(注意这个src可以有多个对象 ...