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)

二分、冒泡、快速、插入排序相关推荐

  1. python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现

    写文章主要是记录自己每天学习的东西,本篇文章主要介绍数据结构中常用的简单的排序算法,虽然这些算法用Python实现起来不是十分的高效,不如c.java之类的运行速度快,应用Python实现主要是为了: ...

  2. Python - 排序( 插入, 冒泡, 快速, 二分 )

    插入排序 算法分析 两次循环, 大循环对队列中的每一个元素拿出来作为小循环的裁定对象 小循环对堆当前循环对象在有序队列中寻找插入的位置 性能参数 空间复杂度 O(1) 时间复杂度 O(n^2) 详细代 ...

  3. 排序及查找----[(冒泡,快速)(拉格朗日,二分)]

    代码展示: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; ...

  4. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  5. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)

    题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...

  6. 8.13模拟:分治二分倍增快速幂

    文章目录 前言 考场 复盘 T1 road T2 shop T3 run T4 stairs 总结 前言 240分 100+80+20+40 T3少取了一个模结果全挂掉了(好不容易推出来了-) T2也 ...

  7. LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)

    1. 题目 给你一个整数数组 nums 和一个整数 target . 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目. 由于答案可能很大 ...

  8. java小编程--二分查找和插入排序

    package com.ujiuye.three; import java.util.Arrays; /*** @author limengdong* @date 2019年7月17日* @class ...

  9. 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+ ...

  10. [二分] WYF快速幂魔改版

    题目出处 qbxt夏北京二期,提高组精英版,WYF出题. 题目 给定一个1~n的排列a,再给出m组询问.每次询问,你需要计算a[a[a[a-[x]]-],总共有t组括号. n,m<=100000 ...

最新文章

  1. Manacher 求最长回文子串算法
  2. youtube根据vedioId获取视频相关信息
  3. 数据采集策略:数据挖掘与统计学的一个区别
  4. 【代码】CyclicBarrier栅栏使用示例
  5. jQuery-1.9.1源码分析系列(十六)ajax——ajax处理流程以及核心函数
  6. implementation of UI5 bindAggregation - busyDialog is handled automatically
  7. Java Maximum Subarray debug
  8. mysql5.6开启memcache_php – 使用MYsql 5.6 Memcache
  9. mysql dump 二进制_mysqldump+二进制日志备份恢复
  10. android 设备注册,i2c_设备注册流程
  11. pareto解是什么意思_Pareto是什么意思
  12. Linux操作系统中rsync工具常见用法
  13. pspice学习杂记
  14. 华中数控系统与高创驱动器EtherCat通讯设置及控制参数
  15. 保边滤波之Mean shift filter
  16. 用C程序编简易双人五子棋
  17. 阿里服务器配置随笔记 centos 服务器 Linux 部分命令合集
  18. 路由器什么牌子好?游戏宅强推
  19. mysqlcheck命令时提示: bash: mysqlcheck: command not found
  20. 租车出行如何避免踩坑,区块链技术解决信任问题

热门文章

  1. jquery 李南江老师jquery和ajax视频教程
  2. 破解,汉化,越狱,解锁,为什么中国的大神总是“昙花一现”?
  3. ImageView和ImageButton的区别
  4. 网页设计软件html图标,网页设计Photoshop(PS)CSS切图必用工具
  5. ArcGIS Server中各种服务详解
  6. [转帖]常用项目管理软件介绍
  7. 2021年中国城市建设状况公报有关供水、燃气、供热数据已出
  8. 好程序员Java教程分享使用HttpClient抓取页面内容
  9. 锐捷wifi魔盒自动优选服务器,锐捷校园网用python实现自动登录(需要有自己的账号)...
  10. OCJP认证 | 国际上最热门的IT认证之一,开启你高级认证的钥匙