深入分析python 排序


Posted in Python onAugust 24, 2020

排序是每个开发人员都需要掌握的技能。排序是对程序本身有一个全面的理解。不同的排序算法很好地展示了算法设计上如何强烈的影响程序的复杂度、运行速度和效率。今天的文章和谈谈大家都熟悉的各种排序使用 Python 如何实现,废话就不多说啦,开干!

选择排序

选择排序一般是将初始值设为初始值,再循环后面每个元素与第一个元素比较,最终筛选出一个最小或最大值,最后将有序的数值排在前面,每次选择当前序列的最小值,将其与当前序列的第一个元素交换位置,每迭代一次,当前序列长度减一。迭代结束,即可得到有序序列。 实现代码如下:

def select_s(data):
  # 第一层循环:取出数组中的每个元素
  for i in range(len(data)):
    temp = i  # 拿取一个元素用来比较
    # 第二层循环:从第i后面的一个值开始循环,与data[i]进行比较
    for j in range(i+1,len(data)):
      if data[j] < data[temp]:
        data[temp], data[j] = data[j], data[temp]
  print(data)

调用运行结果:

if __name__ == '__main__':
  data = [14, 31, 14, 6, 18, 24, 2, 40]
  select_s(data)

输出结果:

[2, 6, 14, 14, 18, 24, 31, 40]

插入排序

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。

插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

深入分析python 排序

实现代码如下:

def insert_s(data):
  # 第一层循环: 从第二个元素开始循环取出元素,取出的元素再与有序区元素进行比较
  for i in range(1,len(data)):
    temp = data[i]
    j = i-1
    while j>=0 and temp < data[j]:
      data[j+1] = data[j]  
      j = j-1  # 在与前面一个元素进行比较,所以j 需要减1
    # 当j = -1 就跳出循环,将temp值赋给第一个值,即data[0]
    data[j+1] = temp
  print(data)

调用运行结果:

if __name__ == '__main__':
data = [12, 3, 13, 56, 10, 22, 2, 40]
insert_s(data)

输出结果:

[2, 3, 10, 12, 13, 22, 40, 56]

冒泡排序

冒泡排序(顺序形式),从左向右,两两比较,如果左边元素大于右边,就交换两个元素的位置。

其中,每一轮排序,序列中最大的元素浮动到最右面。也就是说,每一轮排序,至少确保有一个元素在正确的位置。

这样接下来的循环,就不需要考虑已经排好序的元素了,每次内层循环次数都会减一。

其中,如果有一轮循环之后,次序并没有交换,这时我们就可以停止循环,得到我们想要的有序序列了。

深入分析python 排序

def insert_s(data):
  # 第一层循环: 从第二个元素开始循环取出元素,取出的元素再与有序区元素进行比较
  for i in range(1,len(data)):
    temp = data[i]
    j = i-1
    while j>=0 and temp < data[j]:
      data[j+1] = data[j]  
      j = j-1  # 在与前面一个元素进行比较,所以j 需要减1
    # 当j = -1 就跳出循环,将temp值赋给第一个值,即data[0]
    data[j+1] = temp
  print(data)

调用运行结果:

if __name__ == '__main__':
  data = [12, 3, 13, 56, 10, 22, 2, 40]
  insert_s(data)

输出结果:

[2, 3, 10, 12, 13, 22, 40, 56]

快速排序

首先要打乱序列顺序,以防算法陷入最坏时间复杂度。所以快速排序使用 “分而治之” 的方法。

对于一串序列,首先从中选取一个数,凡是小于这个数的值就被放在左边,凡是大于这个数的值就被放在右边。然后,继续对左右两摞进行快速排序。

直到进行快速排序的序列长度小于 2 (即序列中只有一个值或者空值)。

深入分析python 排序

代码如下:

# 快速排序
def partition(data, left, right):
  temp = data[left]
  while left < right:
    # 如果最右边的值大于中间值,则最右边值往后退一个位置,反之,就将值赋值给最左边位置
    while left < right and data[right] >= temp:
      right = right - 1
    data[left] = data[right]
    # 如果最左边的值小于中间值,则最左边值往前进一个位置,反之,就将值赋值给最右边位置
    while left < right and data[left] <= temp:
      left = left + 1
    data[right] = data[left]
  # 循环结束,即可定位到中间位置,将初始值,赋值到这个位置
  data[left] = temp
  return left


def quick_sort(data, left, right):
  if left < right:
    mid = partition(data, left, right)
    quick_sort(data, left, mid)
    quick_sort(data, mid + 1, right)

总结

今天的文章主要是使用 Python 实现各大排序程序,以及排序算法实现思路的梳理,自己学习的同时给大家整理思路!

示例代码Python 排序了解一下?

以上就是深入分析python 排序的详细内容,更多关于python 排序的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
基python实现多线程网页爬虫
Sep 06 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
Python简单计算给定某一年的某一天是星期几示例
Jun 27 Python
Sanic框架异常处理与中间件操作实例分析
Jul 16 Python
python 用for循环实现1~n求和的实例
Feb 01 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
python爬取王者荣耀全皮肤的简单实现代码
Jan 31 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
详解python metaclass(元类)
Aug 13 Python
python爬虫之爬取笔趣阁小说
Apr 22 Python
详解Flask开发技巧之异常处理
Jun 15 Python
超级实用的8个Python列表技巧
Aug 24 #Python
基于CentOS搭建Python Django环境过程解析
Aug 24 #Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 #Python
python3让print输出不换行的方法
Aug 24 #Python
Django3中的自定义用户模型实例详解
Aug 23 #Python
Python用K-means聚类算法进行客户分群的实现
Aug 23 #Python
pandas参数设置的实用小技巧
Aug 23 #Python
You might like
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
Get或Post提交值的非法数据处理
2006/10/09 PHP
如何在PHP中使用Oracle数据库(6)
2006/10/09 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
lib.utf.js
2007/08/21 Javascript
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
python3 字符串知识点学习笔记
2020/02/08 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
大学生四年生活自我鉴定
2013/11/21 职场文书
企业门卫岗位职责
2013/12/12 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python
Redis Lua脚本实现ip限流示例
2022/07/15 Redis
go goth封装第三方认证库示例详解
2022/08/14 Golang