'''
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. js箭头函数

    ES6标准新增了一种新的函数:Arrow Function(箭头函数). 为什么叫Arrow Function?因为它的定义用的就是一个箭头 x =>x*x 相当于: function(x) { ...

  2. vue进阶语法及生命周期函数

    1.calss和style绑定 操作元素的 class 列表和内联样式style是数据绑定的一个常见需求,它两都是属性,所以可以通过v-bind来绑定 1.1绑定HTML class 可以给v-bin ...

  3. Web前端几种常见的实现水平垂直居中的方法

    第一种: 父容器不设置宽度,用定位实现水平垂直居中. <!DOCTYPE html> <html lang="en"> <head> <m ...

  4. react中图片校验码实现以及new Buffer()使用方法

    图片校验码原理就是图片是后端生成的前端只是前后端传过来的数据流做些处理展示即可,先直接上核心代码图: 这里就是简单得对axios的一些默认项属性重写:最后你只需要将resolve的内容插入页面的< ...

  5. 数组reduce方法以及高级技巧

    基本概念: reduce()方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终为一个值. reduce为数组中的每一个元素依次执行回调函数.不包括数组中被删除或从未赋值的元素,接受两 ...

  6. 搭建mysql主从复制和删库数据恢复策略

    搭建主从复制 主机: [mysqld] 下增加 vim /etc/my.cnf ## 设置 server_id,一般设置为 IP server_id=8 # # 复制过滤:需要备份的数据库,输出 bi ...

  7. Maria-DB

    mysql客户端可用选项: -A, --no-auto-rehash 禁止补全 -u, --user= 用户名,默认为root -h, --host= 服务器主机,默认为localhost -p, - ...

  8. 你的sql查询为什么这么慢?

    做后台开发的程序猿通常需要写各种各样的sql,可很多时候写出来的sql虽然能满足功能性需求,性能上却不尽人意.如果业务复杂,表结构和索引设计又不合理的话,写出来的sql执行时间可能会达到几十甚至上百秒 ...

  9. 基于SpringBoot+SpringSecurity+mybatis+layui实现的一款权限系统

    这是一款适合初学者学习权限以及springBoot开发,mybatis综合操作的后台权限管理系统 其中设计到的数据查询有一对一,一对多,多对多,联合分步查询,充分利用mybatis的强大实现各种操作, ...

  10. Docker 运行MangoDB

    1.Docker运行MangoDB镜像 #创建挂载目录 cd /opt/docker_cfg mkdir -vp mongo/db #获取mongodb镜像 [root@localhost xiaog ...