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实现相关推荐

  1. 八大排序算法的 Python 实现

    八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入 ...

  2. 排序算法 快速排序 python 0913

    排序算法 快速排序 python 0913 快速排序 思路 定义快排方法 接收参数:原始列表,起始位置,终止位置 判断是否符合快排条件,当起始下标与终止下标相等时,代表只有一个元素,无法排序,退出 一 ...

  3. python实现希尔排序_希尔排序算法的python实现

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. def shellSort(items): inc = len(items) / 2 wh ...

  4. python快速排序算法没看懂_你需要知道的九大排序算法【Python实现】之快速排序...

    五.快速排序 基本思想:  通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序. 算法实现: ​ #coding: ...

  5. 【Kick Algorithm】十大排序算法及其Python实现

    文章来源于NewBeeNLP,作者kaiyuan 写在前面 看到好像春招都已经陆续都开始了,最近抽空打算把自己和朋友的经验整理一下分享出来.作为一个刚刚经历秋招打击的自闭儿童,可以非常负责任地说手撕算 ...

  6. 归并排序验证性实验_攻略 | 10 大经典排序算法(Python 版)

    全国信息学大神和家长在这里 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能 ...

  7. python基础===八大排序算法的 Python 实现

    本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...

  8. 【排序算法】python 十大经典排序算法(全网最详)

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...

  9. 八大排序算法的python实现(三)冒泡排序

    代码: #coding:utf-8 #author:徐卜灵 #交换排序.冒泡排序 L = [1, 3, 2, 32, 5, 4] def Bubble_sort(L):for i in range(l ...

  10. 经典排序算法及其Python实现

    写在前面 前面学习了几种典型的数据结构,当然数据结构和算法是密不可分的,算法作为程序的一个重要部分也是在求职面试中屡问不爽的考点,最近我们就来整理一下一些经典的算法,包括排序.查找.图.动态规划等等. ...

最新文章

  1. 生活智慧:奇特的人生法则
  2. 从零单排学Redis【白银】
  3. xftp传输文件错误解决办法
  4. ValueError: Unknown initializer: GlorotUniform
  5. [转]Myeclipse9引入easy_ui时,其中的部分js文件报错
  6. IDC发布2017年中国智慧城市IT十大预测
  7. 修改telnet提示并非_热血传奇:老玩家揭秘!这4个地方都被盛大修改过,第3个80%都想不到...
  8. Mosquitto搭建Android推送服务番外篇一:各种报错解决
  9. Atitit data fmt sumup 常用的数据交换格式 标准 目录 1. 分类标准 2 1.1. 按照结构化与非结构化分类 2 1.2. 按照资料性质分类常见的数据格式txt ,do
  10. vscode 更改中办发文_如何在Visual Studio代码或VSCode中更改集成终端
  11. HackTools———10、使用Python编写TCP客户端、服务器端
  12. 华为手机USB测试灰色
  13. 微信企业号开发之access_token接口调用示例(一)
  14. 程序员常用的网站(个人笔记)
  15. 使用 kickstart 半自动化安装CentOS系统 利用PXE实现自动化安装centos系统
  16. 《土力学与地基基础(二)》在线平时作业3
  17. 我的身体为什以会这样?如何诊治?
  18. 21、关于破解点触的验证码
  19. js实现点击图片在屏幕中间弹出放大效果
  20. 我拿到了北京户口!却是跌落的开始....

热门文章

  1. 世界杯为战斗民族的历史再添荣耀与光辉_数字体验_新浪博客
  2. 也许你看了一本假的天龙八部
  3. 【已解决ie浏览器不能打印预览的问题,页面跳转失败,无法打开】
  4. 041创建MDI程序
  5. 栈:后进先出的线性表
  6. 马尔可夫性的统计检验(马氏性检验)
  7. 安卓获取wifi列表_大家好,我是来给你家 WiFi 提速的
  8. 虚拟光驱打开.bin 文件
  9. 翼次元空间:GoodUP.io与4WiN全球互贸链的基础=智协云店通+BitCOO
  10. 软件著作权的著作权人可以有几个人?版权登记有人数限制吗?