最简单的排序有三种:插入排序,选择排序和冒泡排序。这三种排序比较简单,它们的平均时间复杂度均为O(n^2),在这里对原理就不加赘述了。贴出来源代码。

  1. 插入排序:
  2. def insertion_sort(sort_list):
  3. iter_len = len(sort_list)
  4. if iter_len < 2:
  5. return sort_list
  6. for i in range(1, iter_len):
  7. key = sort_list[i]
  8. j = i - 1
  9. while j >= 0 and sort_list[j] > key:
  10. sort_list[j+1] = sort_list[j]
  11. j -= 1
  12. sort_list[j+1] = key
  13. return sort_list
  14. 冒泡排序:
  15. def bubble_sort(sort_list):
  16. iter_len = len(sort_list)
  17. if iter_len < 2:
  18. return sort_list
  19. for i in range(iter_len-1):
  20. for j in range(iter_len-i-1):
  21. if sort_list[j] > sort_list[j+1]:
  22. sort_list[j], sort_list[j+1] = sort_list[j+1], sort_list[j]
  23. return sort_list
  24. 选择排序:
  25. def selection_sort(sort_list):
  26. iter_len = len(sort_list)
  27. if iter_len < 2:
  28. return sort_list
  29. for i in range(iter_len-1):
  30. smallest = sort_list[i]
  31. location = i
  32. for j in range(i, iter_len):
  33. if sort_list[j] < smallest:
  34. smallest = sort_list[j]
  35. location = j
  36. if i != location:
  37. sort_list[i], sort_list[location] = sort_list[location], sort_list[i]
  38. return sort_list

平均时间复杂度为O(nlogn)的算法有:归并排序,堆排序和快速排序。

  1. #快排
  2. def quickSort(lists):
  3. if len(lists)<=1:
  4. return lists
  5. pivot = lists.pop()
  6. left = []
  7. right = []
  8. for i in lists:
  9. if i<pivot:
  10. left.append(i)
  11. else:
  12. right.append(i)
  13. return quickSort(left)+[pivot]+quickSort(right)
  14. #归并排序
  15. def mergesort(lists):
  16. if len(lists)<=1:
  17. return lists
  18. mid = int(len(lists)/2)
  19. left = lists[:mid]
  20. right = lists[mid:]
  21. mergesort(left)
  22. mergesort(right)
  23. return merge(left,right)
  24. def merge(left,right):
  25. i,j = 0,0
  26. result = []
  27. while i<len(left) and j<len(right):
  28. if left[i]<=right[j]:
  29. result.append(left[i])
  30. i+=1
  31. else:
  32. result.append(right[j])
  33. j+=1
  34. while(i<len(left)):
  35. result.append(left[i])
  36. i+=1
  37. while(j<len(right)):
  38. result.append(right[j])
  39. j+=1
  40. return result
  1. #排序算法集合
    import random
    #冒泡排序
    def BubbleSort(lists):
    for i in range(0,len(lists)):
    for j in range(0,len(lists)-1-i):
    if lists[j]>lists[j+1]:
    lists[j],lists[j+1] = lists[j+1],lists[j]
    return lists
    #选择排序
    def selectionSort(lists):
    for i in range(len(lists)):
    min = i
    for j in range(i+1,len(lists)):
    if lists[j]<lists[min]:
    min = j
    if min != i:
    lists[min],lists[i] = lists[i],lists[min]
    return lists
    #插入排序
    def insertSort(lists):
    for i in range(1,len(lists)):
    key = lists[i]
    j = i-1
    while j>=0 and key<lists[j]:
    lists[j+1] = lists[j]
    j -= 1
    lists[j+1]=key
  2.  
  3. return lists
    #希尔排序
    def shellSort(lists):
    count = len(lists)
    step = 2
    group = int(count/step)
    while group>0:
    for i in range(group):
    j = i+group
    while j<count:
    key = lists[j]
    k = j-group
    while k>=0:
    if key<lists[k]:
    lists[k+group]=lists[k]
    lists[k] = key
    k -= group
    j+=group
    group = int(group/2)
    return lists
    #快排
    def quickSort(lists):
    if len(lists)<=1:
    return lists
    pivot = lists.pop()
    left = []
    right = []
    for i in lists:
    if i<pivot:
    left.append(i)
    else:
    right.append(i)
    return quickSort(left)+[pivot]+quickSort(right)
    #归并排序
    def mergesort(lists):
    if len(lists)<=1:
    return lists
    mid = int(len(lists)/2)
    left = lists[:mid]
    right = lists[mid:]
    left = mergesort(left)
    right = mergesort(right)
    return merge(left,right)
    def merge(left,right):
    i,j = 0,0
    result = []
    while i<len(left) and j<len(right):
    if left[i]<=right[j]:
    result.append(left[i])
    i+=1
    else:
    result.append(right[j])
    j+=1
    while(i<len(left)):
    result.append(left[i])
    i+=1
    while(j<len(right)):
    result.append(right[j])
    j+=1
    return result
    #归并排序
    def mergeSort(lists):
  4.  
  5. mid = int(len(lists)/2)
    left,right = lists[:mid],lists[mid:]
    if len(left)>1:left = mergeSort(left)
    if len(right)>1:right = mergeSort(right)
    res = []
    # while left and right:
    # if left[-1]>=right[-1]:
    # res.append(left.pop())
    # else:
    # res.append(right.pop())
    # res.reverse()
    #return (left or right) + res
    while left and right:
    if left[0]<=right[0]:
    res.append(left.pop(0))
    else:
    res.append(right.pop(0))
    return res+(left or right)
    def adjust_heap(lists,i,size):
    lchild = 2*i+1
    rchild = 2*i+2
    max = i
    if i<size/2:
    if lchild<size and lists[lchild]>lists[max]:
    max = lchild
    if rchild>size and lists[rchild]>lists[max]:
    max = rchild
    if max != i:
    lists[max],lists[i] = lists[i], lists[max]
    adjust_heap(lists,max,size)
    def build_heap(lists,size):
    for i in range(0,int(size/2))[::-1]:
    adjust_heap(lists,i,size)
    def heap_sort(lists):
    size = len(lists)
    build_heap(lists,size)
    for i in range(0,size)[::-1]:
    lists[0],lists[i] = lists[i],lists[0]
    adjust_heap(lists,0,i)
    return lists
  6.  
  7. if __name__ =='__main__':
    lists = [random.randint(1,20) for n in range(10)]
    #print(lists)
    #print(sorted(lists))
    #print(lists)
    #print(BubbleSort(lists))
    #print(lists)
    #print(selectionSort(lists))
    #print(lists)
    #print(insertSort(lists))
    #print(lists)
    #print(shellSort(lists))
    #print(lists)
    #print(mergesort(lists))
    #print(lists)
    #print(quickSort(lists))
    #print(lists)
    #print(mergeSort(lists))
    print(lists)
    print(heap_sort(lists))

用Python实现常见排序算法的更多相关文章

  1. python 的常见排序算法实现

    python 的常见排序算法实现 参考以下链接:https://www.cnblogs.com/shiluoliming/p/6740585.html 算法(Algorithm)是指解题方案的准确而完 ...

  2. python实现常见排序算法

    #coding=utf-8from collections import deque #冒泡排序def bubblesort(l):#复杂度平均O(n*2) 最优O(n) 最坏O(n*2) for i ...

  3. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  4. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  5. python——常见排序算法解析

    算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...

  6. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  7. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  8. JS常见排序算法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

随机推荐

  1. SGU 269. Rooks(DP)

    题意: 给n(<=250)条水平网格,然后在上面放k棋子,每行每列都只能放一个.求方法总数. Solution: 简单的DP, 只要对给出的水平长度排个序就很容易处理了. 需要用到高精度. 偷懒 ...

  2. chrome输入框记住密码导致背景黄色的解决方案

    在form头部增加以下内容 <input type="text" style="display:hidden;"> <input type=& ...

  3. js隔行变色

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Safari浏览器的调试

    最近做浏览器兼容的时候发现Safari的脚本调试工具比较难找,因此与大家分享一下 1.找到脚本调试的选项 2.勾选此选项 3.在页面空白处右击打开调试窗口 4.看到下方的调试窗口了 细心的读者会发现, ...

  5. codeforces 359 C - Robbers' watch

    Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u   Description Robb ...

  6. ASP.NET MVC轻教程 Step By Step 12——客户端验证

    前面两节使用的两种数据验证方法都是在服务器端进行的,也就是提交了表单,数据回传给服务器才能验证.这样会带来两个问题,一是用户体验不好,用户提交了表单之后才知道存在问题:二是会给服务器带来额外的压力.我 ...

  7. Spring MVC小结1

    由于最近刚开始学Spring MVC,所以来讲一下自己的理解. 首先进行环境配置: 1.jdk 2.myeclipse 3.tomcat 4.maven 配置maven的时候出现了一个小的问题,JAV ...

  8. 【MyBatis学习笔记】

    [MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...

  9. JBoss for luna

    Redhat官方手顺 貌似已经404了,搬运地址 我的Eclipse是Luna,每次进入Eclipse Market去装 http://marketplace.eclipse.org/content/ ...

  10. RabbitMQ安装简单过程

    找到一本ACTION IN RABBITMQ,仔细看.现在先安装起来.. 参考主要的URL,包括安装,用户管理,权限管理.我用的都是最新版本. http://my.oschina.net/indest ...