一些排序算法的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),因此称为非线性时间比较类排序.包括:冒泡排序.选择排序.归并排序.快速 ...
随机推荐
- WSASocket()与Socket()的区别 转
/**************************************************** WSASocket是Windows专用,支持异步操作:socket是unix标准,只能同步操 ...
- Python—面向对象06 内置方法
一 .isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object ...
- js关于密码框强弱度的提示
三种密码强度的正则表达式: 较弱:全是数字或全是字母 6-16个字符:/^[0-9]{6,16}$|^[a-zA-Z]{6,16}$/; 中级:数字.26个英文字母 6-16个字符: /^[A-Za- ...
- 由inline-block小例子引申出的一些问题,及IE6、IE7兼容性解决方案
使用场景分析: 常见的对块与块之间的横向排列处理 对同级所有元素使用display:inline-block; , 之后块与块直接会产生间隙问题 解决办法: 给父级设 font-size:0; 别高兴 ...
- Java基础——数组复习
数组是一个变量,存储相同数据类型的一组数据 声明一个变量就是在内存空间划出一块合适的空间 声明一个数组就是在内存空间划出一串连续的空间 数组长度固定不变,避免数组越界 数组是静态分配内存空间的,所 ...
- Spring技术内幕阅读笔记(一)
1.BeanFactory:实现ioc容器的最基本形式.String FACTORY_BEAN_PREFIX = "&";Object getBean(String var ...
- iOS之UITextField输入错误的震动动画
//左右震动效果 - (void)shake:(UIView *)view { CGRect frame = view.frame; CAKeyframeAnimation *shakeAnimati ...
- substr在oracle和mysql中的应用和区别
Oracle: 书写格式: (1)Select substr(字段名(string) , 起始位置(int) , 截取长度(int)) 示例: selectsubstr('123456',0,3)a ...
- python核心编程2 第十一章 练习
11-2 函数.结合你对练习5-2的解,以便你创建一个带一对相同数字并同时返回它们之和以及产物的结合函数. multiply = lambda x, y: x * y if __name__ == ' ...
- android xml实现animation 4种动画效果
animation有四种动画类型 分别为alpha(透明的渐变).rotate(旋转).scale(尺寸伸缩).translate(移动),二实现的分发有两种,一种是javaCode,另外一种是XML ...