一、冒泡排序

1、冒泡排序实现思路

  • 需要两层循环,外层循环控制总共循环几次,内层循环控制交换的次数(注意索引超界的问题)。
  • 外层第一次循环,内层第一次循环,将第一个元素(y)与第二个元素(y+1)进行比较,如果第一个数比第二个数大,就交换两个数的位置,内层第二次循环,然后将大的数(也就是交换后的第二个元素)与第三个元素进行比较,将大数往后交换,依次类推...内层循环结束,这时最大数就跑到了最后面;开始外层第二次循环,依次类推...
  • 需要注意的是索引超界的问题,当外层第一次循环结束后,最大数已经排到了最后面,下次循环最大数就不需要做比较了,那么下次循环内层循环就要减掉1,以免索引超界,以此类推...也就是随着x的增加,内层循环减掉x就行了。

2、代码实现

 def sort_nums(nums):
length_nums = len(nums) for x in range(length_nums):
for y in range(length_nums - x - ):
if nums[y] > nums[y + ]:
nums[y], nums[y + ] = nums[y + ], nums[y] return nums print(sort_nums([, , , , , , , ]))

优化的地方:

  • 是否有这样一种情况,每次比较后,都没有交换位置,也就是说这组数据正好是一组有序的数据?那我们可以加一个开关来进行标记,如果内层循环一次都没有交换,那么说明这组数据是有序的,也就没有必要进行循环耗费资源了。
 def sort_nums(nums):
length_nums = len(nums) for x in range(length_nums):
flag = False
for y in range(length_nums - x - 1):
if nums[y] > nums[y + 1]:
nums[y], nums[y + 1] = nums[y + 1], nums[y]
flag = True if not flag:
break return nums print(sort_nums([3, 1, 56, 632, 13, 51, 123, 3]))

二、简单选择排序

1、简单选择排序实现思路

  • 需要两层循环,外层循环控制循环的总次数,内层循环控制确定最大值需要循环的次数。
  • 外层第一次循环,首先确定一个最大数的索引位置,先假设索引0的数最大,然后内层循环对后面的数依次进行比较,每次比较都将最大的索引位置更新,最后内层循环结束,第一个最大数的索引就找出来了,然后将原来记录最大数的索引位置(maxindex)与索引0的数进行交换,第一个大数就已经排序完成,然后开始第二次外层循环,一次类推...

2、代码实现

 def sort_nums(nums):
length = len(nums) for x in range(length):
maxindex = x
for y in range(x+1, length):
if nums[maxindex] < nums[y]:
maxindex = y if x != maxindex:
nums[maxindex], nums[x] = nums[x], nums[maxindex] return nums nums = [234, 2, 41, 5, 346, 347, 5367, 3, 24]
print(sort_nums(nums))

优化的地方:

  • 既然每次循环确定了一个最大数,那么是否可以在一次循环中同时找到一个最大数和一个最小数呢?当然可以,这样循环的总次数就减少了一半,效率大大提高。
 def sort_nums(nums):
length = len(nums) for x in range(length//2):
maxindex = x
minindex = -x -1
minorigin = minindex
for y in range(x+1, length-x):
if nums[maxindex] < nums[y]:
maxindex = y
if nums[minindex] > nums[-y-1]:
minindex = -y-1 if x != maxindex:
nums[maxindex], nums[x] = nums[x], nums[maxindex]
if x == minindex or x == length+minindex: # 如果最小值的索引交换过了,就要更新最小值的索引
minindex = maxindex
if minorigin != minindex and nums[minorigin] != nums[minindex]:
nums[minindex], nums[minorigin] = nums[minorigin], nums[minindex] return nums nums = [234, 2, 41, 5, 346, 347, 5367, 3, 24]
print(sort_nums(nums))

三、插入排序

1、插入排序实现思路

  • 确定一个哨兵位置,将待比较的数插入到哨兵的位置,然后从索引为2的数开始比较,每次比较后将最大数插入到合适的位置。

2、代码实现

 def sort_nums(nums):
nums = [0] + nums
length = len(nums) for x in range(2, length):
nums[0] = nums[x]
j = x - 1
if nums[j] > nums[0]:
while nums[j] > nums[0]:
nums[j + 1] = nums[j]
j -= 1 nums[j + 1] = nums[0] return nums[1:] nums = [214, 35, 1, 51, 35, 13, 41, 5, 4365, 32]
print(sort_nums(nums))

四、快速排序

1、快四排序实现思路

  • 有两个指针left和right分别指向列表的第一个元素和最后一个元素,取列表中第一个元素作为参考值k。
  • 然后left指向的元素和k进行比较,如果小于或者等于k,left就一直向右移动,直到移动到大于k的地方停下。
  • 然后right指向的元素和k进行比较,如果大于k,right就一直向左移动,直到移动到小于k的地方停下。
  • 此时,如果left和right还没有相遇的话(left<right),则二者指向的值进行交换。
  • 如果已经相遇,则说明第一次排序结束,将arr[right]和arr[0]的值进行交换,进行后面的递归。

2、代码实现

 def quick_sort(arr, low, high):
if low < high:
# 传入参数,通过Partitions函数,获取k下标值
k = partitions(arr, low, high)
# 递归排序列表k下标左侧的列表
quick_sort(arr, low, k - 1)
# 递归排序列表k下标右侧的列表
quick_sort(arr, k + 1, high) def partitions(arr, low, high):
left = low
right = high
# 将最左侧的值赋值给参考值k
k = arr[left]
# 当left下标小于right下标的情况下,此时判断二者移动是否相交,若未相交,则一直循环
while left < right:
# 当left对应的值小于k参考值,就一直向右移动
while arr[left] <= k:
left += 1
# 当right对应的值大于k参考值,就一直向左移动
while arr[right] > k:
right -= 1
# 若移动完,二者仍未相遇则交换下标对应的值
if left < right:
arr[left], arr[right] = arr[right], arr[left]
# 若移动完,已经相遇,则交换right对应的值和参考值
arr[low] = arr[right]
arr[right] = k
# 返回k值
return right arr = [6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
quick_sort(arr, 0, len(arr) - 1)
print(arr)

(python)排序算法的更多相关文章

  1. python排序算法实现(冒泡、选择、插入)

    python排序算法实现(冒泡.选择.插入) python 从小到大排序 1.冒泡排序: O(n2) s=[3,4,2,5,1,9] #count = 0 for i in range(len(s)) ...

  2. Python排序算法之选择排序定义与用法示例

    Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...

  3. 44.python排序算法(冒泡+选择)

    一,冒泡排序: 是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个,如果他们的排序错误就把他们交换过来. 冒泡排序是稳定的(所谓稳定性就是两个相同的元素不会交换位置) 冒泡排序算法的运作如下 ...

  4. python 排序算法总结及实例详解

    python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...

  5. 带你掌握4种Python 排序算法

    摘要:在编程里,排序是一个重要算法,它可以帮助我们更快.更容易地定位数据.在这篇文章中,我们将使用排序算法分类器对我们的数组进行排序,了解它们是如何工作的. 本文分享自华为云社区<Python ...

  6. Python排序算法

    不觉已经有半年没写了,时间真是容易荒废,这半年过了个春节,去拉萨旅行.本职工作也很忙,没有开展系统的学习和总结. 今年开始静下心来从基础开始学习,主要分为三部分,算法.线性代数.概率统计. 首先学习算 ...

  7. Python排序算法——冒泡排序

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10786904.html 一.冒泡排序(Bubb ...

  8. Python排序算法——插入排序

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10787464.html 一.插入排序(Inse ...

  9. Python排序算法——选择排序

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10787340.html 一.选择排序(Sele ...

  10. Python排序算法——快速排序

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10768593.html 排序算法(Sortin ...

随机推荐

  1. Spring Boot SOAP Webservice例子

    前言 本文将学习如何利用Spring boot快速创建SOAP webservice服务: 虽然目前REST和微服务越来越流行,但是SOAP在某些情况下,仍然有它的用武之地: 在本篇 spring b ...

  2. 1197多行事务要求更大的max_binlog_cache_size处理与优化

    1197多语句事务要求更大的max_binlog_cache_size报错   binlog_cache_size:为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存,提高记录bi ...

  3. 【干货】利用MVC5+EF6搭建博客系统(一)EF Code frist、实现泛型数据仓储以及业务逻辑

    习MVC有一段时间了,决定自己写一套Demo了,写完源码再共享. PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.框架搭建 二.创建数据库 1.创建一个空的EF code fr ...

  4. Nginx 配置https 服务

    一.HTTPS 服务 为什么需要HTTPS? 原因:HTTP不安全 1.传输数据被中间人盗用.信息泄露 2.数据内容劫持.篡改 HTTPS协议的实现 对传输内容进行加密以及身份验证 HTTPS加密校验 ...

  5. mysql累积聚合

    累积聚合为聚合从序列内第一个元素到当前元素的数据,如为每个员工返回每月开始到现在累积的订单数量和平均订单数量 行号问题有两个解决方案,分别是为使用子查询和使用连接.子查询的方法通常比较直观,可读性强. ...

  6. JAVA课程设计——一个简单的教务人事管理系统

    大三上学期期末总结,没错,上学期,写在下学期新学期开始,哈哈哈. 上学期学习了面向对象程序设计,课程设计的题目使用JAVA语言完成一个简单的教务人事管理系统,能够实现访问数据库的登录验证,分别按部门和 ...

  7. Perl中的hash类型

    hash类型 hash类型也称为字典.关联数组.映射(map)等等,其实它们都是同一种东西:键值对.每一个Key对应一个Value. hash会将key/value散列后,按序放进hash桶.散列后的 ...

  8. Perl的IO操作(2):更多文件句柄模式

    open函数除了> >> <这三种最基本的文件句柄模式,还支持更丰富的操作模式,例如管道.其实bash shell支持的重定向模式,perl都支持,即使是2>&1 ...

  9. 华为路由器 HDLC 实验

    HDLC 简介 高级数据链路控制(High-Level Data Link Control 或简称 HDLC),是一个在同步网上传输 数据.面向比特的数据链路层协议,它是由国际标准化组织(ISO)根据 ...

  10. 基于SSM框架贺州学院校园二手交易平台设计与实现

    前言 这个是我当时的毕业论文,分享出来,给同学们参考. 绪论 随着中国新四大发明的诞生,网购成了千千万万网友们购物的新方式,新的购物方式促进商业的发展,但随着人们生活水平的提高,许多新购置的物品用了没 ...