当前位置: 首页 > news >正文

0_1排序与搜索

Bubble Sort 冒泡排序

冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

步骤:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对第0个到第n-1个数据做同样的工作。这时,最大的数就“浮”到了数组最后的位置上。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
def bubble_sort(arry):n = len(arry) #获得数组的长度for i in range(n):for j in range(1,n-i):if arry[j-1] > arry[j] : #如果前者比后者大arry[j-1],arry[j] = arry[j],arry[j-1] #则交换两者return arry

 

针对上述代码还有两种优化方案。

优化1:某一趟遍历如果没有数据交换,则说明已经排好序了,因此不用再进行迭代了。用一个标记记录这个状态即可。

#优化1:某一趟遍历如果没有数据交换,则说明已经排好序了,因此不用再进行迭代了。
#用一个标记记录这个状态即可。
def bubble_sort2(ary):
    n = len(ary)
    for i in range(n):
        flag = 1 #标记
        for j in range(1,n-i):
            if ary[j-1] > ary[j] :
                ary[j-1],ary[j] = ary[j],ary[j-1]
                flag = 0
        if flag : #全排好序了,直接跳出
            break
    return ary

优化2:记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序,不用再排序了。因此通过记录最后发生数据交换的位置就可以确定下次循环的范围了。

#优化2:记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序了。
# 因此通过记录最后发生数据交换的位置就可以确定下次循环的范围了。
def bubble_sort3(ary):
    n = len(ary)
    k = n #k为循环的范围,初始值n
    for i in range(n):
        flag = 1
        for j in range(1,k): #只遍历到最后交换的位置即可
            if ary[j-1] > ary[j] :
                ary[j-1],ary[j] = ary[j],ary[j-1]
                k = j #记录最后交换的位置
                flag = 0
        if flag :
            break
    return ary

Selection Sort 选择排序

选择排序无疑是最简单直观的排序。它的工作原理如下。

步骤:

  1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 以此类推,直到所有元素均排序完毕。
def select_sort(ary):n = len(ary)for i in range(0,n):min = i #最小元素下标标记for j in range(i+1,n):if ary[j] < ary[min] :min = j #找到最小值的下标ary[min],ary[i] = ary[i],ary[min] #交换两者return ary

Insertion Sort 插入排序

插入排序的工作原理是,对于每个未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

步骤:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果被扫描的元素(已排序)大于新元素,将该元素后移一位
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5

def insert_sort(ary):
    n = len(ary)
    for i in range(1,n):
        if ary[i] < ary[i-1]:
       

相关文章:

  • 【unitrix】 3.2 位取反运算(not.rs)
  • 【音视频】PJSIP库——示例简介、C++类说明
  • 【 感知集群】大规模分布式基础设施的AI赋能蓝图
  • Spring AOP @Before (前置通知): 在目标方法执行前做什么?
  • ChatGPT上瘾,大脑萎缩47%!?
  • Windows本地部署wordpress
  • 矩阵置零C++
  • Mac电脑-Office 2024 长期支持版(Excel、Word、PPT)
  • 《Go语言圣经》map
  • F接口基础.go
  • 基于Spring Boot的计算机考研交流系统的设计与实现
  • 微信小程序canvas实现抽奖动画
  • Arduino Nano 33 BLE Sense Rev 2开发板使用指南之【环境搭建 / 点灯】
  • 视频续播功能实现 - 断点续看从前端到 Spring Boot 后端
  • IDE深度集成+实时反馈:企业级软件测试方案Parasoft如何重塑汽车巨头的测试流程
  • MyBatis原理剖析(三)--加载配置文件
  • shared_ptr 源码解析
  • 安卓vscodeAI开发实例
  • 【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率
  • GVim-vimrc 字体缩放与界面优化配置
  • 网站开发凭证做什么科目/今日最新闻
  • 网站建设为啥每年都要收费/阐述网络推广的主要方法
  • 大尺度做爰床视频网站/网络营销策划书的结构是什么
  • 宁波网站建设哪家强/上海今天最新新闻10条
  • 网站的基本概念/如何做网络推广赚钱
  • 黄冈网站优化公司哪家好/媒体资源