二分、冒泡、快速、插入排序
1.二分查找(折半查找)
找出**有序**数据中的中间元素,由中间元素将数据分成左右两部分,比较中间元素与待查找值的大小:
如果相等,则查找 成功;
如果中间元素比查找元素值大,则继续在左侧重复该过程;
如果中间元素比查找元素值小,则继续在右侧重复该过程;
如此递归下去,直到成功找到或者查找完所有数据为止。
使用递归实现:
# -*- coding: utf-8 -*-
# @Author : Codeooo
# @Time : 2021/12/05# 二分查找# 使用递归实现# 原始数据 value
# 待查找数据 key - 6
# 当前查找范围左侧数据对应下标值 left
# 当前查找范围右侧数据对应下标值 right
def binary(value, key, left, right):# 递归退出条件if left > right:# 查找结束-查找失败return -1# 获取中间元素对应下标middle = (left + right) // 2# 对比中间数据值与待查找值if value[middle] == key:# 查找成功, 返回对应下标值return middleelif value[middle] > key:# 中间数据值大于待查找值时# 继续在左侧重复该过程# 查找范围缩小:左侧不变,右侧变为中间元素的前一位return binary(value, key, left, middle-1)else:# 中间数据值小于待查找值时# 继续在右侧重复该过程# 查找范围缩小:左侧变为中间元素的后一位,右侧不变return binary(value, key, middle+1, right)if __name__ == "__main__":# 原始数据 valuevalue = [1,2,3,4,5,6,7,8,9,10,11,12,13]# 待查找数据 key key = 6# 调用二分查找res = binary(value, key, 0, len(value)-1)if res == -1:print("查找失败")else:print("查找成功:", res)
使用循环实现:
# -*- coding: utf-8 -*-
# @Author : Codeooo
# @Time : 2021/12/05# 二分查找# 使用循环实现# 原始数据 value
# 待查找数据 key - 6
def binary(value, key):# 获取左侧/右侧数据对应下标值left = 0right = len(value) - 1# 如果存在合法范围则继续while left <= right:# 获取中间数据对应下标值middle = (left + right) // 2# 比较中间数据值与待查找数据if value[middle] == key:# 中间数据值与待查找数据相等# 查找成功,返回对应下标值return middleelif value[middle] > key:# 中间数据值大于待查找数据时# 继续在左侧重复查找# 查找范围缩小:左侧不变,右侧变为中间的前一位right = middle - 1else:# 中间数据值小于待查找数据时# 继续在右侧重复查找# 查找范围缩小:右侧不变,左侧变为中间的后一位left = middle + 1# 查找失败,返回-1return -1if __name__ == "__main__":# 原始数据 valuevalue = [1,2,3,4,5,6,7,8,9,10,11,12,13]# 待查找数据 key key = 6# 调用二分查找res = binary(value, key)if res == -1:print("查找失败")else:print("查找成功:", res)
2. 冒泡排序
重复走访要排序的数据,依次对比每两个相邻的元素,如果次序错误则交换;重复进行直到没有相邻数据需要交换为止,此时完成排序
# -*- coding: utf-8 -*-
# @Author : Codeooo
# @Time : 2021/12/05# 冒泡排序# 原始数据 value
def bubble(value):# 外层循环:对应数据走访的次数for i in range(len(value) - 1):# 设置初始标识为的值,为Falseflag = False# 内层循环:对应每次走访数据时,相邻数据对比次数for j in range(len(value) - 1 - i):# 要求从小到大,如前者大于后者,则交换if value[j] > value[j+1]:value[j],value[j+1] = value[j+1],value[j]# 若数据发生交换,则置为Trueflag = True# 若当前走访数据时,未发生数据交换# 则当前数据有序,无需继续走访if flag is False:break# 打印走访次数print("走访次数", i+1)if __name__ == "__main__":# 原始数据 # value = [180, 230, 149, 260, 130, 170, 160, 169, 163, 178]value = [350, 130, 149, 160, 163, 169, 170, 178, 180, 230, 260]print("原始数据:", value)# 调用排序bubble(value)print("排序后:", value)
3.插入排序
将数据插入到已经有序的部分中,从而得到新的有序数据。
默认首元素自然有序,取下一个元素对已经有序的数据从后向前扫描:
若扫描到的有序数据*大于*取出数据,则该有序数据后移;
若扫描到的有序数据*小于等于*取出数据,则在该有序数据后面插入取出数据;
若所有有序数据*均大于*取出数据,则有序数据首部插入取出数据。
重复上步骤,直到处理完所有数据为止。
# -*- coding: utf-8 -*-
# @Author : Codeooo
# @Time : 2021/12/05# 插入排序# 原始数据
def insert(value):# 外层循环:对应遍历所有无序数据,依次取出元素for i in range(1, len(value)):# 取出当前无序数据temp = value[i]# 存储取出数据的插入位置(下标值)pos = i# 内层循环:对应从后向前扫描所有有序数据,找出插入数据的位置# start:从最后一个有序数据开始,即无序数据前一位# end:到有序数据首位终止,包含下标为0# step:从后向前扫描:-1for j in range(i-1, -1, -1):if value[j] > temp:# 有序数据大于取出数据# 有序数据后移value[j+1] = value[j]# 更新当前取出数据可插入位置pos = jelse:# 有序数据小于等于取出数据# 在有序数据后插入取出数据# 有序数据的后一位pos = j + 1# 确定插入位置,退出内层循环break# 在指定的位置插入数据value[pos] = tempif __name__ == "__main__":# 原始数据value = [99,20,85,70,30,18,100,13,76,98]print("原始数据:",value)# 调用排序insert(value)print("排序后:",value)
4.快速排序
首先任意取一个数据(通常取第一个数据)作为关键数据,然后将所有比关键数据小的放在它的前面,所有比关键数据大的放在它的后面,这样的一个过程称为一趟快速排序。
通过一趟快速排序,将所有数据分割成独立的两部分,然后按照这个方法递归对两部分数据进行快速排序,以达到所有数据有序。
# -*- coding: utf-8 -*-
# @Author : Codeooo
# @Time : 2021/12/05#快速排序# 原始数据
def quick(value):# 递归的退出条件# 仅有一个数据时无需继续排序if len(value) < 2:return value# 获取关键数据mark = value[0]# 找出所有比关键数据小的smaller = [x for x in value if x < mark]# 找出所有比关键数据大的bigger = [x for x in value if x > mark]# 找出所有与关键数据相等的eq = [x for x in value if x == mark]# 从小到大排序return quick(smaller) + eq + quick(bigger)if __name__ == "__main__":# 原始数据value = [88,38,77,43,18,1,100,99,96,69]print("原始数据:", value)# 调用快速排序value = quick(value)print("排序后:", value)
5.顺序查找
从待查找数据中第一元素开始,逐个对每个元素值与要查找的内容进行对比,如果相等,则查找成功;如果到最后仍未找到则查找失败。
# -*- coding: utf-8 -*-
# @Author : Codeooo
# @Time : 2021/12/05# 顺序查找# 原始数据 value
# [12, 10, 1, 3, 5, 9, 11, 6, 2, 4, 8, 7, 13]
# 待查找数据 key - 7
def linear(value, key):# 获取所有数据for i in range(len(value)):# 对比取出数据与待查找数据if value[i] == key:# 查找成功,返回当前下标值return i# 查找完所有数据,仍未找到# 查找失败,返回非法下标值return -1if __name__ == "__main__":# 原始数据 value value = [12, 10, 1, 3, 5, 9, 11, 6, 2, 4, 8, 7, 13]# 待查找数据 key - 7 key = 7# 调用查找函数res = linear(value, key)if res == -1:# 查找失败print("查找失败")else:# 查找成功print("查找成功:", res)print((0 + 11)// 2)print((3 + 4) // 2)
二分、冒泡、快速、插入排序相关推荐
- python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现
写文章主要是记录自己每天学习的东西,本篇文章主要介绍数据结构中常用的简单的排序算法,虽然这些算法用Python实现起来不是十分的高效,不如c.java之类的运行速度快,应用Python实现主要是为了: ...
- Python - 排序( 插入, 冒泡, 快速, 二分 )
插入排序 算法分析 两次循环, 大循环对队列中的每一个元素拿出来作为小循环的裁定对象 小循环对堆当前循环对象在有序队列中寻找插入的位置 性能参数 空间复杂度 O(1) 时间复杂度 O(n^2) 详细代 ...
- 排序及查找----[(冒泡,快速)(拉格朗日,二分)]
代码展示: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; ...
- C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】
目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...
- BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)
题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...
- 8.13模拟:分治二分倍增快速幂
文章目录 前言 考场 复盘 T1 road T2 shop T3 run T4 stairs 总结 前言 240分 100+80+20+40 T3少取了一个模结果全挂掉了(好不容易推出来了-) T2也 ...
- LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)
1. 题目 给你一个整数数组 nums 和一个整数 target . 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目. 由于答案可能很大 ...
- java小编程--二分查找和插入排序
package com.ujiuye.three; import java.util.Arrays; /*** @author limengdong* @date 2019年7月17日* @class ...
- python选择、冒泡、插入排序
arr=[8,3,2,6,1,4,9,7] 选择排序:代码: arr = [8,3,2,6,1,4,9,7] for i in range(0,len(arr)): for j in range(i+ ...
- [二分] WYF快速幂魔改版
题目出处 qbxt夏北京二期,提高组精英版,WYF出题. 题目 给定一个1~n的排列a,再给出m组询问.每次询问,你需要计算a[a[a[a-[x]]-],总共有t组括号. n,m<=100000 ...
最新文章
- Manacher 求最长回文子串算法
- youtube根据vedioId获取视频相关信息
- 数据采集策略:数据挖掘与统计学的一个区别
- 【代码】CyclicBarrier栅栏使用示例
- jQuery-1.9.1源码分析系列(十六)ajax——ajax处理流程以及核心函数
- implementation of UI5 bindAggregation - busyDialog is handled automatically
- Java Maximum Subarray debug
- mysql5.6开启memcache_php – 使用MYsql 5.6 Memcache
- mysql dump 二进制_mysqldump+二进制日志备份恢复
- android 设备注册,i2c_设备注册流程
- pareto解是什么意思_Pareto是什么意思
- Linux操作系统中rsync工具常见用法
- pspice学习杂记
- 华中数控系统与高创驱动器EtherCat通讯设置及控制参数
- 保边滤波之Mean shift filter
- 用C程序编简易双人五子棋
- 阿里服务器配置随笔记 centos 服务器 Linux 部分命令合集
- 路由器什么牌子好?游戏宅强推
- mysqlcheck命令时提示: bash: mysqlcheck: command not found
- 租车出行如何避免踩坑,区块链技术解决信任问题
热门文章
- jquery 李南江老师jquery和ajax视频教程
- 破解,汉化,越狱,解锁,为什么中国的大神总是“昙花一现”?
- ImageView和ImageButton的区别
- 网页设计软件html图标,网页设计Photoshop(PS)CSS切图必用工具
- ArcGIS Server中各种服务详解
- [转帖]常用项目管理软件介绍
- 2021年中国城市建设状况公报有关供水、燃气、供热数据已出
- 好程序员Java教程分享使用HttpClient抓取页面内容
- 锐捷wifi魔盒自动优选服务器,锐捷校园网用python实现自动登录(需要有自己的账号)...
- OCJP认证 | 国际上最热门的IT认证之一,开启你高级认证的钥匙