冒泡排序


  1. # 冒泡排序
  2. def bubble_sort(l):
  3. length = len(l)
  4. # 外层循环 length遍,内层循环少一遍
  5. while length:
  6. for j in range(length - 1):
  7. # 找出最大值,然后交换位置到最后
  8. if l[j] > l[length - 1]:
  9. l[j], l[length - 1] = l[length - 1], l[j]
  10. length -= 1
  11. if __name__ == "__main__":
  12. l = [5, 1, 9, 3, 2, 7]
  13. bubble_sort(l)
  14. print l

插入排序

  1. """
  2. 插入排序和冒泡排序的区别在于:
  3. 插入排序的前提是:左边是有序的数列
  4. 而冒泡排序:相邻的值进行交换,一共进行n次交换
  5. """
  6. def insert_sort(l):
  7. # 循环 除第一个数字组成的有序数组 以外的数字
  8. for i in range(1, len(l)):
  9. # 每一个数字,依次和有序数组进行比较
  10. print l[:i]
  11. for j in range(len(l[:i])):
  12. if l[i] < l[j]:
  13. l[i], l[j] = l[j], l[i]
  14. if __name__ == "__main__":
  15. l = [5, 1, 9, 3, 2, 7]
  16. print l
  17. insert_sort(l)
  18. print("result: " + str(l))

归并排序

  1. def MergeSort(lists):
  2. if len(lists) <= 1:
  3. return lists
  4. num = int(len(lists) / 2)
  5. # 从中间,进行数据的拆分, 递归的返回数据进行迭代排序
  6. left = MergeSort(lists[:num])
  7. right = MergeSort(lists[num:])
  8. print left
  9. print "*" * 20
  10. print right
  11. print "_" * 20
  12. return Merge(left, right)
  13. def Merge(left, right):
  14. r, l = 0, 0
  15. result = []
  16. while l < len(left) and r < len(right):
  17. if left[l] < right[r]:
  18. result.append(left[l])
  19. l += 1
  20. else:
  21. result.append(right[r])
  22. r += 1
  23. result += right[r:]
  24. result += left[l:]
  25. print 'result:', result
  26. return result
  27. if __name__ == "__main__":
  28. print MergeSort([1, 2, 3, 4, 5, 6, 7, 90, 21, 23, 45])

快速排序

  1. def quick_sort(l, start, end):
  2. i = start
  3. j = end
  4. # 结束排序
  5. if i >= j:
  6. return
  7. # 保存首个数值
  8. key = l[i]
  9. # 一次排序,i和j的值不断的靠拢,然后最终停止,结束一次排序
  10. while i < j:
  11. # 和最右边的比较,如果>=key,然后j-1,慢慢的和前一个值比较;如果值<key,那么就交换位置
  12. while i < j and key <= l[j]:
  13. print key, l[j], '*' * 30
  14. j -= 1
  15. l[i] = l[j]
  16. # 交换位置后,然后在和最左边的值开始比较,如果<=key,然后i+1,慢慢的和后一个值比较;如果值>key,那么就交换位置
  17. while i < j and key >= l[i]:
  18. print key, l[i], '*' * 30
  19. i += 1
  20. l[j] = l[i]
  21. l[i] = key
  22. # 左边排序
  23. quick_sort(l, start, j-1)
  24. # 右边排序
  25. quick_sort(l, i+1, end)
  26. if __name__ == "__main__":
  27. l = [5, 1, 9, 3, 2, 7]
  28. quick_sort(l, 0, len(l) - 1)
  29. print l

选择排序

  1. """
  2. 选择排序和冒泡排序的区别在于:
  3. 选择排序的前提是:找到最大值的位置,最后才进行1次交换
  4. 而冒泡排序:相邻的值进行交换,一共进行n次交换
  5. """
  6. def selection_sort(l):
  7. length = len(l) - 1
  8. while length:
  9. index = length
  10. # 第一个数字,和后面每一个数字进行对比,找出最大值,放到最后!!
  11. for j in range(length):
  12. if l[j] > l[index]:
  13. index = j
  14. l[length], l[index] = l[index], l[length]
  15. print len(l) - length, l
  16. length -= 1
  17. if __name__ == "__main__":
  18. l = [5, 1, 9, 3, 2, 7]
  19. print l
  20. selection_sort(l)
  21. print("result: " + str(l))

希尔排序

  1. def insert_sort(l, start, increment):
  2. for i in range(start+increment, len(l), increment):
  3. for j in range(start, len(l[:i]), increment):
  4. if l[i] < l[j]:
  5. l[i], l[j] = l[j], l[i]
  6. print increment, '--',l
  7. return l
  8. def shell_sort(l, increment):
  9. # 依次进行分层
  10. while increment:
  11. # 每一层,都进行n次插入排序
  12. for i in range(0, increment):
  13. insert_sort(l, i, increment)
  14. increment -= 1
  15. return l
  16. if __name__ == "__main__":
  17. l = [5, 2, 9, 8, 1, 10, 3, 4, 7]
  18. increment = len(l)/3+1 if len(l)%3 else len(l)/3
  19. print "开始", l
  20. l = shell_sort(l, increment)
  21. print "结束", l

树递归

  1. class Node():
  2. def __init__(self, value, left=None, right=None):
  3. self.value = value
  4. self.left = left
  5. self.right = right
  6. def midRecusion(node):
  7. if node is None:
  8. return
  9. midRecusion(node.left)
  10. print node.value,
  11. midRecusion(node.right)
  12. def midIterator(node):
  13. stack = []
  14. while stack or node:
  15. if node is not None:
  16. stack.append(node)
  17. node = node.left
  18. else:
  19. node = stack.pop(-1)
  20. print node.value,
  21. node = node.right
  22. if __name__ == "__main__":
  23. node = Node("D", Node("B", Node("A"), Node("C")), Node("E", right=Node("G", left=Node("F"))))
  24. print('\n中序遍历<递归>:')
  25. midRecusion(node)
  26. print('\n中序遍历<迭代>:')
  27. midIterator(node)

更新冒泡排序

  1. '''
  2. 迭代使用的是循环结构。
  3. 递归使用的是选择结构。
  4. '''
  5. # 递归求解
  6. def calculate(l):
  7. if len(l) <= 1:
  8. return l[0]
  9. value = calculate(l[1:])
  10. return 10**(len(l) - 1) * l[0] + value
  11. # 迭代求解
  12. def calculate2(l):
  13. result = 0
  14. while len(l) >= 1:
  15. result += 10 ** (len(l)-1) * l[0]
  16. l = l[1:]
  17. return result
  18. l1 = [1, 2, 3]
  19. l2 = [4, 5]
  20. sum = 0
  21. result = calculate(l1) + calculate(l2)
  22. # result = calculate2(l1) + calculate2(l2)
  23. print(result)

各种排序算法-用Python实现的更多相关文章

  1. 八大排序算法的 Python 实现

    转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...

  2. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  3. 十大经典排序算法总结 (Python)

    作业部落:https://www.zybuluo.com/listenviolet/note/1399285 以上链接是自己在作业部落编辑的排序算法总结- Github: https://github ...

  4. 一些排序算法的Python实现

    ''' Created on 2016/12/16 Created by freeol.cn 一些排序算法的Python实现 @author: 拽拽绅士 ''' '''值交换''' def swap( ...

  5. 基本排序算法的Python实现

    本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序.希望大家回顾知识的时候也能从我的这篇文章得到帮助. 为了防止误导读者,本文所有概念性 ...

  6. 经典排序算法及python实现

    今天我们来谈谈几种经典排序算法,然后用python来实现,最后通过数据来比较几个算法时间 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据 ...

  7. python基础===八大排序算法的 Python 实现

    本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...

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

    本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...

  9. 十大经典排序算法(python实现)(原创)

    个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...

  10. 十大经典排序算法的python实现

    十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序.包括:冒泡排序.选择排序.归并排序.快速 ...

随机推荐

  1. poj 1144(求割点个数)

    题目链接:http://poj.org/problem?id=1144 思路:判断一个点是否是割点的两个条件:1.如果一个点v是根结点并且它的子女个数大于等于2,则v是割点.2.如果点v不是根结点,并 ...

  2. Achartengine.jar绘制动态图形-饼图

    Achartengine.jar绘制动态图形一 --饼图 PS:我们在做安卓程序的时候,免不了会做一些图形,自己可以选择自定义view ,就是用Canvas画,也可以用写好的jar包,就是achart ...

  3. IIS无法连接LocalDb,怎么办?

    最近安装了vs 2013,电脑配置不太好,所以没有安装数据库,直接使用vs2013自带的localdb工具,直接运行访问本地mdf数据库文件.但是部署到IIS就出问题了.问题就像下面的图片一样. 最后 ...

  4. MYSQL存储引擎介绍--应用场景

    MySQL存储引擎通常有哪3种?各自分别有什么特点?应用场景是哪些? MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默 ...

  5. Introduction to Mathematical Thinking - Week 6 - Proofs with Quantifieers

    Mthod of proof by cases 证明完所有的条件分支,然后得出结论. 证明任意 使用任意 注意,对于一个任意的东西,你不知道它的具体信息.比如对于任意正数,你不知道它是 1 还是 2等 ...

  6. Objective-c 单例模式

    用GCD写Objective-c的单例模式和C#有比较大的区别 声明h文件 #import <Foundation/Foundation.h> @interface me : NSObje ...

  7. 费马小定理 Fermat Theory

    w 整数的质数次方和自身的差是是质数的倍数 费马小定理(Fermat Theory)是数论中的一个重要定理,其内容为: 假如p是质数,且Gcd(a,p)=1,那么 a(p-1)≡1(mod p).即: ...

  8. spring和hibernate整合时设置自动生成数据库的表

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFa ...

  9. Power Systems 虚拟化简介

    本文向您详细地介绍了 Power System 虚拟化相关的技术和亮点,让您对这些最新的虚拟化技术有一个全面的了解.本文来自 IBM Systems Magazine for AIX 中文版. 自从引 ...

  10. Symfony4 数据库连接

    代码 https://github.com/liudianpeng/BlogMVC-Symfony4 在 .env 文件可以调整一下数据库连接信息 ###> doctrine/doctrine- ...