'''
Created on 2016/12/16
Created by freeol.cn
一些排序算法的Python实现
@author: 拽拽绅士
''' '''值交换'''
def swap(m, n):
c = m; m = n; n = c;
return m, n '''冒泡排序
特征:
稳定排序算法
最坏时间复杂度O(n^2)
平均时间复杂度O(n^2)
空间复杂度O(1)
总结:重复的相邻元素进行比较交换,越大的元素
会经由交换慢慢“浮”到数列的顶端'''
def bubbleSort(a):
for i in range(0, len(a)):
for j in range(0, len(a)-i-1):
if a[j] > a[j+1]:
a[j], a[j+1] = swap(a[j],a[j+1])
return a '''选择排序
特征:
不稳定排序算法
最坏时间复杂度O(n^2)
平均时间复杂度O(n^2)
空间复杂度O(1)
总结:重复的选择后面最小的与遍历到的位置交换'''
def selectSort(a):
for i in range(0, len(a)-1):
min = i
for j in range(i+1, len(a)):
if a[j] < a[min]:
min = j
a[i], a[min] = swap(a[i], a[min])
return a '''插入排序
特征:
稳定排序算法
最坏时间复杂度O(n^2)
平均时间复杂度O(n^2)
空间复杂度O(1)
总结:
重复的将遍历元素暂存后,将遍历元素之前的元素较暂存元素大的后移,
将暂存元素插入后移元素最小的前面弥补遍历之前元素后移覆盖引起的元素缺失'''
def insertSort(a):
for i in range(1, len(a)):
e=a[i]; j=i;
while j>0:
if a[j-1] > e:
a[j] = a[j-1]
else:
break
j-=1
a[j] = e
return a '''归并排序
特征:
稳定排序算法
最坏时间复杂度O(nlogn)
平均时间复杂度O(nlogn)
空间复杂度O(n)
总结:
分治法(Divide and Conquer)的典型应用,
递归的将数组分成左右两部分数组,每次分完后将小的放在左边的数组,
大的放在右边的数组,分完后将左右两个数组归并成一个数组'''
class merge(object):
a = None
def __init__(self, a):
self.a = a def __MergeSort(self, lst):
if len(lst) <= 1:
return lst
num = int(len(lst)/2)
left = self.__MergeSort(lst[:num])
right = self.__MergeSort(lst[num:])
return self.__Merge(left, right) def __Merge(self, left, right):
R, L=0, 0
result=[]
while L < len(left) and R < len(right):
if left[L] < right[R]:
result.append(left[L])
L += 1
else:
result.append(right[R])
R += 1
result += right[R:]
result += left[L:]
return result def sort(self):
return self.__MergeSort(self.a) '''快速排序
特征:
不稳定排序算法
最坏时间复杂度O(n^2)
平均时间复杂度O(nlogn)
空间复杂度O(logn)~O(n)
注:初始最低位L输入为0, 最高位H输入为数组长度减1即数组末尾的索引值
总结:
引用分治法对冒泡法的改进,
递归的以数组最低位为基数,重复的左右两端相向与基数比较,
左边比基数大的与右边比基数小的交换,直到左右相遇,
这是一个将最低位元素移动到已排序后数组位置的过程'''
def quickSort(a, L, H):
i = L; j = H;
if i >= j:
return a
B = a[i]
while i < j:
while i < j and a[j] >= B:
j = j-1
a[i] = a[j]
while i < j and a[i] <= B:
i = i+1
a[j] = a[i]
a[i] = B
a = quickSort(a, L, i-1)
a = quickSort(a, j+1, H)
return a '''统计排序
注:由于统计排序需要有已知有序数组做筒,故这里统计后
使用python自带的sort生成已知有序数组
总结:已知有序数组做筒,统计相同元素数量
'''
def countSort(a):
dtmp = {}
for i in a:
if i not in dtmp:
dtmp[i]=1
else:
dtmp[i]+=1
tmp = list(dtmp.keys())
tmp.sort()
a=[]
for i in tmp:
for j in range(dtmp[i]):
a.append(i)
dtmp = None
tmp = None
return a '''基数排序
稳定排序算法
注:因为在这里以0-9分别做每位比较后存入的筒,这里输入的数组中应是整数'''
def radixSort(a):
max = 0
for i in a:
if i > max:
max = i
b = len(str(max))
for i in range(b):
tmp=[[], [], [], [], [], [], [], [], [], []]
for j in a:
v = str(j)
if len(v)-1 < i:
tmp[0].append(j)
else:
k = v[len(v)-i-1:len(v)-i]
tmp[int(k)].append(j)
index = 0
for t in tmp:
for tv in t:
a[index] = tv
index+=1
return a def main():
r = [15,28,6,1,5,47,265,19, 8, 255, 166, 78, 41, 8, 16,
215,128,26,11,25,147,265,19, 28, 155, 266, 178, 1, 8, 160,
153,282,6,12,52,472,652,97, 87, 55, 66, 78, 14, 80, 16]
#r = ['c', 'v', 's', 'd', 'e', 'f', 'a', 'k', 'l']
print('未排序数组 长度=',len(r),'\n', r)
a0 = r.copy()
a1 = r.copy()
a2 = r.copy()
a3 = r.copy()
a4 = r.copy()
a5 = r.copy()
a6 = r.copy()
r.sort()
print('python中list自带的排序\n', r)
print('冒泡排序\n', bubbleSort(a0))
print('选择排序\n', selectSort(a1))
print('插入排序\n', insertSort(a2))
print('归并排序\n', merge(a3).sort())
print('快速排序\n', quickSort(a4,0, len(a4)-1))
print('统计排序\n', countSort(a5))
print('基数排序\n', radixSort(a6)) if __name__ == '__main__':
main()

一些排序算法的Python实现的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. MySQL单列索引和联合索引

    MySQL单列索引和联合索引   所有的MySQL列类型能被索引.在相关的列上的使用索引是改进SELECT操作性能的最好方法. 一个表最多可有16个索引.最大索引长度是256个字节,尽管这可以在编译M ...

  2. sql中 decode() 的用法

    sql中 decode() 的用法 SELECT ID,DECODE(inParam,'Param','value1' ,'value2') name FROM yytj2018 如果 inParam ...

  3. js中的throw err的作用

    1.阻止程序的运行 2.把错误消息打到控制台

  4. mysql的数据操作和内置功能总结

    一.数据的增删改查 1.插入数据 a.插入完整数据(顺序插入) INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); INSERT INTO 表名 ...

  5. Sencha Visual Studio(IDE插件)

    Sencha Visual Studio(IDE插件) 首先从官网上下载Visual Studio插件,注意不是VSCode编辑器,下载完后安装打开Visual Studio提示你去注册,输入你的se ...

  6. 13.4.3 鼠标与滚轮事件【JavaScript高级程序设计第三版】

    鼠标事件是Web 开发中最常用的一类事件,毕竟鼠标还是最主要的定位设备.DOM3 级事件中定义了9 个鼠标事件,简介如下. click:在用户单击主鼠标按钮(一般是左边的按钮)或者按下回车键时触发.这 ...

  7. 20190105-打印字母C,H,N,口等图像和杨辉三角

    1. 打印字母C ****** * * * * ****** def print_c(n): print('*' * n) for i in range(n): print('* ') print(' ...

  8. Teen Readers【青少年读者】

    Teen Readers Teens and younger children are reading a lot less for fun, according to a Common Sense ...

  9. js分类多选全选

    效果如图: HTML代码: <div class="form-group quanxian-wrap"> <label>项目</label> & ...

  10. HBase 伪分布式环境搭建及基础命令使用

    一.前提条件: (1)文件存储在HDFS文件系统之上.因此必须启动hadoop服务.(namenode,datanode,resourcemanager,nodemanager,historyserv ...