'''
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. JVM 监控以及内存分析

    1 内存分析1.1 jmap -histo 命令pid=`jps | awk '{if ($2 == "Jps") print $1}'`jmap -histo $pid > ...

  2. SQL数据完整性

    1.数据的完整性 1. 什么是数据的完整性 保证用户输入的数据保存到数据库中是正确的 2.添加数据完整性 在创建表的时候给表添加约束 3.完整性分类 实体完整性.域完整性.引用完整性 ​ ​ 2.完整 ...

  3. <body> 中的 JavaScript

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  4. android SQLITE的基本使用总结(八)

    sharedPreferences只适合存储比较简单的数据和键值对,支持不同的数据类型 文件存储连键值对都没有,不会进行任何格式化处理,存储简单的二进制或者文本数据 sqlite则能处理一些数据量大, ...

  5. 自定义App首次启动引导页

    代码如下 #import"ZBGuidePageView.h" @interfaceZBGuidePageView()<UIScrollViewDelegate> @p ...

  6. Shiro登录中遇到了问题

    Shiro登录中遇到了问题 记录二次开发中遇到的问题, 如果系统学习Shiro, 推荐跟我学Shrio. 问题 项目是要将验证从本地改为LDAP验证, 但是因为jeecms的验证和授权中, 用户和角色 ...

  7. MySQL传输表空间使用方法

    1.目标端创建同样的表结构 CREATE TABLE `test` (       `id` int(11) DEFAULT NULL     ) ENGINE=InnoDB DEFAULT CHAR ...

  8. 介绍三种PHP加密解密算法

    PHP加密解密算法 这里主要介绍三种常用的加密解密算法:方法一: /** * @param $string 要加密/解密的字符串 * @param string $operation 类型,ENCOD ...

  9. Apache Maven(三):POM

    什么是 POM? POM (Project Object Model) 项目对象模型.它是一个XML文件,其中包含有关Maven用于构建项目的项目和配置细节的信息.它包含大多数项目的默认值.例如,构建 ...

  10. 机器学习基础之knn的简单例子

    knn算法是人工智能的基本算法,类似于语言中的"hello world!",python中的机器学习核心模块:Scikit-Learn Scikit-learn(sklearn)模 ...