一些排序算法的Python实现
'''
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实现的更多相关文章
- 八大排序算法的 Python 实现
转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- 十大经典排序算法总结 (Python)
作业部落:https://www.zybuluo.com/listenviolet/note/1399285 以上链接是自己在作业部落编辑的排序算法总结- Github: https://github ...
- 基本排序算法的Python实现
本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序.希望大家回顾知识的时候也能从我的这篇文章得到帮助. 为了防止误导读者,本文所有概念性 ...
- 经典排序算法及python实现
今天我们来谈谈几种经典排序算法,然后用python来实现,最后通过数据来比较几个算法时间 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据 ...
- python基础===八大排序算法的 Python 实现
本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...
- 八大排序算法---基于python
本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...
- 十大经典排序算法(python实现)(原创)
个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...
- 十大经典排序算法的python实现
十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序.包括:冒泡排序.选择排序.归并排序.快速 ...
随机推荐
- HDU 1226 超级密码(数学 bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1226 超级密码 Time Limit: 20000/10000 MS (Java/Others) ...
- 使用终端命令行将本地项目上传到Github并提交代码
第一步: 在Github上创建自己的repository 第二步:建立本地仓库cd到你的本地项目根目录下,执行git命令 1:$ cd 到你的项目目录下 2:$ git init 第三步:将本地项目工 ...
- Plupload+easyui+springmvc实现批量上传
demo下载(java项目):http://pan.baidu.com/s/1ntmoGEd 可兼容所有常用浏览器,当前版本为V1.5.4,如果不兼容,肯定是你没有调试好啊 1.jsp代码 <% ...
- <寒假逆向学习第一天> 破解基础知识之介绍常见工具和壳的特征
对于我们新手来说,程序是什么语言编写的?程序到底有没有加壳?程序加了什么壳?一直在我们心中充满了疑惑,本文我将根据我的近期学习,总结一下常见的工具和壳的特征. 一:程序是什么语言编译的 从目前接触到程 ...
- ABAP术语-Business Object
Business Object 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/07/1028364.html Represents a ce ...
- Percona-Tookit工具包之pt-index-usage
Preface There're many ways relevent with performance tuning.For example,using indexes proper ...
- PHP无法用下标访问
php数组分为普通数组和关联数组,普通数组可以用下标访问,而关联数组不可以.
- docker和docker compose常用操作命令
首先区分一下docker中几个概念 Image:镜像,相当于一个root文件系统,不包含任何动态数据 Container:容器,镜像运行时的实体,实质是进程,容器进程运行于属于自己的独立的命名空间 d ...
- c#vs连接SQL sever数据库入门操作
对于需要连接数据库的项目,可以参考的简单初级代码.实现打开数据库,读入数据功能 using System; using System.Collections.Generic; using System ...
- 实验7 shell程序设计二(1)
编写一个shell过程完成如下功能(必须在脚本中使用函数)1.程序接收3个参数:$1/$2和$3,合并两个文件$1/$2为$3,并显示,三个文件均为文本文件.2.如果文件$3不存在,那么先报告缺少$3 ...