1. import cProfile
  2. import random
  3. class SortAlgorithm:
  4. def __init__(self,unsortedlist=[]):
  5. self.unsortedlist = unsortedlist or [i for i in random.sample(range(10000),100)]
  6. self.length = len(self.unsortedlist)
  7.  
  8. def bubble_sort(self):
  9. '''
  10. 冒泡排序:从第一个元素开始,每每相邻的两个元素进行比较,若前者比后者大则交换位置。最后两个相邻元素比较完成后,最大的元素形成,
  11. 然后再次从头开始进行比较,若元素个数为n个,则总共需要进行n-1轮比较就可完成排序。一般情况下算法复杂度是平方级。
  12. '''
  13. for i in range(self.length-1):
  14. for j in range(self.length-i-1):
  15. if self.unsortedlist[j]>self.unsortedlist[j+1]:
  16. self.unsortedlist[j],self.unsortedlist[j+1] = self.unsortedlist[j+1],self.unsortedlist[j]
  17.  
  18. return self.unsortedlist
  19.  
  20. def selection_sort(self):
  21. '''
  22. 选择排序:从未排序的序列中找到一个最小的元素,放到第一位,再从剩余未排序的序列中找到最小的元素,放到第二位,依此类推,直到所有元素都已排序完毕。
  23. 假设序列元素总共n个,则我们需要找n-1轮,就可以使该序列排好序。时间复杂度是平方级。
  24. '''
  25. for i in range(self.length-1):
  26. for j in range(i+1,self.length):
  27. if self.unsortedlist[i]>self.unsortedlist[j]:
  28. self.unsortedlist[i],self.unsortedlist[j] = self.unsortedlist[j],self.unsortedlist[i]
  29. return self.unsortedlist
  30.  
  31. def insert_sort(self):
  32. '''
  33. 插入排序:把序列的第一个元素当成已排序列表中的元素,接着从第二个元素开始,与已排序列表中的元素一一比较,并放到合适的位置。假设有n个元素需要排序,则需要n-1轮插入就可排好序。
  34. 时间复杂度为平方级。
  35. '''
  36. for i in range(1,self.length):
  37. for j in range(i):
  38. if self.unsortedlist[i]<self.unsortedlist[j]:
  39. self.unsortedlist.insert(j,self.unsortedlist.pop(i))
  40. break
  41. return self.unsortedlist
  42.  
  43. def merge_sort(self,lists=None,divid=None):
  44. '''
  45. 归并排序:归并排序是约翰·冯·诺伊曼发明,是一种典型的分治法(Divide and Conquer),把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。
  46. 然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小元素放入结果序列中进行合并,最终完成归并排序。时间复杂度是线性对数级。
  47. '''
  48. lists = lists or self.unsortedlist
  49. if len(lists)<=1:
  50. return lists
  51. divid = divid or len(lists)//2
  52. left_list = self.merge_sort(lists=lists[:divid])
  53. right_list = self.merge_sort(lists=lists[divid:])
  54.  
  55. result = []
  56. l,r=0,0
  57. while len(left_list)>l and len(right_list)>r:
  58. if left_list[l]<right_list[r]:
  59. result.append(left_list[l])
  60. l+=1
  61. else:
  62. result.append(right_list[r])
  63. r+=1
  64. result+=left_list[l:]
  65. result+=right_list[r:]
  66. return result
  67.  
  68. def quick_sort(self,lists=None):
  69. '''
  70. 快速排序:快速排序也是一种分治思想,基本思想是先随便在无序列表中找一个元素,以这个元素为基准,其他所有元素都跟该元素比,比该元素小的成为一个子序列,比该元素大的成为另一个子序列,
  71. 这样其中一部分数据都比另一部分小,然后再按照此方法分别进行快速排序,最终达到排序效果。时间复杂度一般为线性对数级。
  72. '''
  73. lists = lists or self.unsortedlist
  74. if len(lists)<=1:
  75. return lists
  76. small = []
  77. large = []
  78. divid = lists.pop(0)
  79. for each in lists:
  80. if each<divid:
  81. small.append(each)
  82. else:
  83. large.append(each)
  84. self.quick_sort(small)
  85. self.quick_sort(large)
  86. return self.quick_sort(small)+[divid]+self.quick_sort(large)
  87.  
  88. if __name__=='__main__':
  89. sort = SortAlgorithm()
  90. #result = sort.bubble_sort()
  91. #result = sort.selection_sort()
  92. #result = sort.insert_sort()
  93. #result = sort.merge_sort()
  94. result = sort.quick_sort()
  95. print(result)

Python之基本排序算法的实现的更多相关文章

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

    本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...

  2. 排序算法的实现之Javascript(常用)

    排序算法的实现之Javascript 话不多说,直接代码. 1.冒泡排序 1.依次比较相邻的两个数,如果前一个比后一个大,则交换两者的位置,否则位置不变 2.按照第一步的方法重复操作前length-1 ...

  3. python排序算法的实现-插入

    1.算法: 设有一组关键字{ K 1 , K 2 ,…, K n }:排序开始就认为 K 1 是一个有序序列:让 K 2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列:然后让 K ...

  4. python排序算法的实现-快速排序

    1. 算法描述: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. 2.pyth ...

  5. python排序算法的实现-选择

    1.算法: 对于一组关键字{K1,K2,…,Kn}, 首先从K1,K2,…,Kn中选择最小值,假如它是 Kz,则将Kz与 K1对换: 然后从K2,K3,… ,Kn中选择最小值 Kz,再将Kz与K2对换 ...

  6. python排序算法的实现-冒泡

    1.算法描述: (1)共循环 n-1 次 (2)每次循环中,如果 前面的数大于后面的数,就交换 (3)设置一个标签,如果上次没有交换,就说明这个是已经好了的. 2.代码 #!/usr/bin/pyth ...

  7. 基于python的几种排序算法的实现

    #!usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2019/3/28 10:26 # @Author : Yosef-夜雨声烦 # @Email ...

  8. 排序算法的实现(归并,快排,堆排,希尔排序 O(N*log(N)))

    今天跟着左老师的视频,理解了四种复杂度为 O(N*log(N))的排序算法,以前也理解过过程,今天根据实际的代码,感觉基本的算法还是很简单的,只是自己写的时候可能一些边界条件,循环控制条件把握不好. ...

  9. 排序算法的实现(C/C++实现)

    存档: #include <iostream> #include <stdlib.h> #include <sort.h> #define maxsize 20 u ...

随机推荐

  1. python logging的应用

    #-*-coding:utf-8-*-#util import logging import logging from logging.handlers import RotatingFileHand ...

  2. csharp:using Newtonsoft.Json.Net2.0 in .net 2.0 webform

    /// <summary> /// http://www.weather.com.cn/data/sk/101280601.html /// {"weatherinfo" ...

  3. javascript实现SHA1算法

    web里面密码直接传到后台是不安全的,有时候需要进行加密,找到一个不错的javascript SHA1算法: <!DOCTYPE html> <html lang="en& ...

  4. 【Android】11.0 UI开发(二)——列表控件ListView的简单实现1

    ************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10342462.html ***************** ...

  5. python 中 \n 和转义r的作用和\r的实际应用

    我们先看看这张转义字符图: 1. 知识储备 \r 表示将光标的位置回退到本行的开头位置 \b 表示将光标的位置回退一位 在 python 语言中, 使用 print 打印输出时,默认是会进行换行的.如 ...

  6. Google自写插件详解

    谷歌插件详解,跳转至个人主页查看. GoogleExtension

  7. Data Flow ->> Source ->> Error Output ->> Error & Truncation: Ignore Failure, Redirect Now, Fail Component

    Ignore Failure: 当该字段遇到错误时,字段值被设为NULL Redirect Now: 把该行输出到SSIS的Source组件的红色输出线,这时红色输出线应该连接一个可以接受结果集的组件 ...

  8. 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果

    学习笔记---Javascript事件Event.IE浏览器下的拖拽效果     1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...

  9. Redis设计与实现读后感

    看了一下时间,现在是2018年8月22日14:28,看完最后一页内容之后,我简短的停留了一下,任思绪翻飞. redis设计与实现大概看了有12天左右,12天前,我的心里很乱,整个人都处于一种焦虑不安的 ...

  10. QT的键值对应关系 看完开发节省时间 哈哈

    http://blog.csdn.net/wangjieest/article/details/8283656