一些排序算法的Python实现
1 ''' 2 Created on 2016/12/16 3 Created by freeol.cn 4 一些排序算法的Python实现 5 @author: 拽拽绅士 6 ''' 7 8 '''值交换''' 9 def swap(m, n): 10 c = m; m = n; n = c; 11 return m, n 12 13 '''冒泡排序 14 特征: 15 稳定排序算法 16 最坏时间复杂度O(n^2) 17 平均时间复杂度O(n^2) 18 空间复杂度O(1) 19 总结:重复的相邻元素进行比较交换,越大的元素 20 会经由交换慢慢“浮”到数列的顶端''' 21 def bubbleSort(a): 22 for i in range(0, len(a)): 23 for j in range(0, len(a)-i-1): 24 if a[j] > a[j+1]: 25 a[j], a[j+1] = swap(a[j],a[j+1]) 26 return a 27 28 '''选择排序 29 特征: 30 不稳定排序算法 31 最坏时间复杂度O(n^2) 32 平均时间复杂度O(n^2) 33 空间复杂度O(1) 34 总结:重复的选择后面最小的与遍历到的位置交换''' 35 def selectSort(a): 36 for i in range(0, len(a)-1): 37 min = i 38 for j in range(i+1, len(a)): 39 if a[j] < a[min]: 40 min = j 41 a[i], a[min] = swap(a[i], a[min]) 42 return a 43 44 '''插入排序 45 特征: 46 稳定排序算法 47 最坏时间复杂度O(n^2) 48 平均时间复杂度O(n^2) 49 空间复杂度O(1) 50 总结: 51 重复的将遍历元素暂存后,将遍历元素之前的元素较暂存元素大的后移, 52 将暂存元素插入后移元素最小的前面弥补遍历之前元素后移覆盖引起的元素缺失''' 53 def insertSort(a): 54 for i in range(1, len(a)): 55 e=a[i]; j=i; 56 while j>0: 57 if a[j-1] > e: 58 a[j] = a[j-1] 59 else: 60 break 61 j-=1 62 a[j] = e 63 return a 64 65 '''归并排序 66 特征: 67 稳定排序算法 68 最坏时间复杂度O(nlogn) 69 平均时间复杂度O(nlogn) 70 空间复杂度O(n) 71 总结: 72 分治法(Divide and Conquer)的典型应用, 73 递归的将数组分成左右两部分数组,每次分完后将小的放在左边的数组, 74 大的放在右边的数组,分完后将左右两个数组归并成一个数组''' 75 class merge(object): 76 a = None 77 def __init__(self, a): 78 self.a = a 79 80 def __MergeSort(self, lst): 81 if len(lst) <= 1: 82 return lst 83 num = int(len(lst)/2) 84 left = self.__MergeSort(lst[:num]) 85 right = self.__MergeSort(lst[num:]) 86 return self.__Merge(left, right) 87 88 def __Merge(self, left, right): 89 R, L=0, 0 90 result=[] 91 while L < len(left) and R < len(right): 92 if left[L] < right[R]: 93 result.append(left[L]) 94 L += 1 95 else: 96 result.append(right[R]) 97 R += 1 98 result += right[R:] 99 result += left[L:] 100 return result 101 102 def sort(self): 103 return self.__MergeSort(self.a) 104 105 '''快速排序 106 特征: 107 不稳定排序算法 108 最坏时间复杂度O(n^2) 109 平均时间复杂度O(nlogn) 110 空间复杂度O(logn)~O(n) 111 注:初始最低位L输入为0, 最高位H输入为数组长度减1即数组末尾的索引值 112 总结: 113 引用分治法对冒泡法的改进, 114 递归的以数组最低位为基数,重复的左右两端相向与基数比较, 115 左边比基数大的与右边比基数小的交换,直到左右相遇, 116 这是一个将最低位元素移动到已排序后数组位置的过程''' 117 def quickSort(a, L, H): 118 i = L; j = H; 119 if i >= j: 120 return a 121 B = a[i] 122 while i < j: 123 while i < j and a[j] >= B: 124 j = j-1 125 a[i] = a[j] 126 while i < j and a[i] <= B: 127 i = i+1 128 a[j] = a[i] 129 a[i] = B 130 a = quickSort(a, L, i-1) 131 a = quickSort(a, j+1, H) 132 return a 133 134 '''统计排序 135 注:由于统计排序需要有已知有序数组做筒,故这里统计后 136 使用python自带的sort生成已知有序数组 137 总结:已知有序数组做筒,统计相同元素数量 138 ''' 139 def countSort(a): 140 dtmp = {} 141 for i in a: 142 if i not in dtmp: 143 dtmp[i]=1 144 else: 145 dtmp[i]+=1 146 tmp = list(dtmp.keys()) 147 tmp.sort() 148 a=[] 149 for i in tmp: 150 for j in range(dtmp[i]): 151 a.append(i) 152 dtmp = None 153 tmp = None 154 return a 155 156 '''基数排序 157 稳定排序算法 158 注:因为在这里以0-9分别做每位比较后存入的筒,这里输入的数组中应是整数''' 159 def radixSort(a): 160 max = 0 161 for i in a: 162 if i > max: 163 max = i 164 b = len(str(max)) 165 for i in range(b): 166 tmp=[[], [], [], [], [], [], [], [], [], []] 167 for j in a: 168 v = str(j) 169 if len(v)-1 < i: 170 tmp[0].append(j) 171 else: 172 k = v[len(v)-i-1:len(v)-i] 173 tmp[int(k)].append(j) 174 index = 0 175 for t in tmp: 176 for tv in t: 177 a[index] = tv 178 index+=1 179 return a 180 181 def main(): 182 r = [15,28,6,1,5,47,265,19, 8, 255, 166, 78, 41, 8, 16, 183 215,128,26,11,25,147,265,19, 28, 155, 266, 178, 1, 8, 160, 184 153,282,6,12,52,472,652,97, 87, 55, 66, 78, 14, 80, 16] 185 #r = ['c', 'v', 's', 'd', 'e', 'f', 'a', 'k', 'l'] 186 print('未排序数组 长度=',len(r),'\n', r) 187 a0 = r.copy() 188 a1 = r.copy() 189 a2 = r.copy() 190 a3 = r.copy() 191 a4 = r.copy() 192 a5 = r.copy() 193 a6 = r.copy() 194 r.sort() 195 print('python中list自带的排序\n', r) 196 print('冒泡排序\n', bubbleSort(a0)) 197 print('选择排序\n', selectSort(a1)) 198 print('插入排序\n', insertSort(a2)) 199 print('归并排序\n', merge(a3).sort()) 200 print('快速排序\n', quickSort(a4,0, len(a4)-1)) 201 print('统计排序\n', countSort(a5)) 202 print('基数排序\n', radixSort(a6)) 203 204 if __name__ == '__main__': 205 main()
转载于:https://www.cnblogs.com/zzss/p/6206368.html
一些排序算法的Python实现相关推荐
- 八大排序算法的 Python 实现
八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入 ...
- 排序算法 快速排序 python 0913
排序算法 快速排序 python 0913 快速排序 思路 定义快排方法 接收参数:原始列表,起始位置,终止位置 判断是否符合快排条件,当起始下标与终止下标相等时,代表只有一个元素,无法排序,退出 一 ...
- python实现希尔排序_希尔排序算法的python实现
下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. def shellSort(items): inc = len(items) / 2 wh ...
- python快速排序算法没看懂_你需要知道的九大排序算法【Python实现】之快速排序...
五.快速排序 基本思想: 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序. 算法实现: #coding: ...
- 【Kick Algorithm】十大排序算法及其Python实现
文章来源于NewBeeNLP,作者kaiyuan 写在前面 看到好像春招都已经陆续都开始了,最近抽空打算把自己和朋友的经验整理一下分享出来.作为一个刚刚经历秋招打击的自闭儿童,可以非常负责任地说手撕算 ...
- 归并排序验证性实验_攻略 | 10 大经典排序算法(Python 版)
全国信息学大神和家长在这里 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能 ...
- python基础===八大排序算法的 Python 实现
本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...
- 【排序算法】python 十大经典排序算法(全网最详)
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...
- 八大排序算法的python实现(三)冒泡排序
代码: #coding:utf-8 #author:徐卜灵 #交换排序.冒泡排序 L = [1, 3, 2, 32, 5, 4] def Bubble_sort(L):for i in range(l ...
- 经典排序算法及其Python实现
写在前面 前面学习了几种典型的数据结构,当然数据结构和算法是密不可分的,算法作为程序的一个重要部分也是在求职面试中屡问不爽的考点,最近我们就来整理一下一些经典的算法,包括排序.查找.图.动态规划等等. ...
最新文章
- 生活智慧:奇特的人生法则
- 从零单排学Redis【白银】
- xftp传输文件错误解决办法
- ValueError: Unknown initializer: GlorotUniform
- [转]Myeclipse9引入easy_ui时,其中的部分js文件报错
- IDC发布2017年中国智慧城市IT十大预测
- 修改telnet提示并非_热血传奇:老玩家揭秘!这4个地方都被盛大修改过,第3个80%都想不到...
- Mosquitto搭建Android推送服务番外篇一:各种报错解决
- Atitit data fmt sumup 常用的数据交换格式 标准 目录 1. 分类标准	2 1.1. 按照结构化与非结构化分类	2 1.2. 按照资料性质分类常见的数据格式txt ,do
- vscode 更改中办发文_如何在Visual Studio代码或VSCode中更改集成终端
- HackTools———10、使用Python编写TCP客户端、服务器端
- 华为手机USB测试灰色
- 微信企业号开发之access_token接口调用示例(一)
- 程序员常用的网站(个人笔记)
- 使用 kickstart 半自动化安装CentOS系统 利用PXE实现自动化安装centos系统
- 《土力学与地基基础(二)》在线平时作业3
- 我的身体为什以会这样?如何诊治?
- 21、关于破解点触的验证码
- js实现点击图片在屏幕中间弹出放大效果
- 我拿到了北京户口!却是跌落的开始....