查找与排序-选择排序

选择排序也是基于“比较”和“交换”两种操作来实现的排序方法 。        

每一趟排序在待排序序列中选择关键字最小(或最大)的数据元素加入到排好序的序列前(或后),直至所有元素排完为止。

一、简单选择排序

1.简单选择排序基本思想

也称直接选择排序。假设待排序的n个数据元素存放在数组a中,那么简单选择排序可做如下描述:    (1)第一趟从a[0]开始,通过n-1次比较,从n个数据元素中选出最小元素,记为a[min],与a[0]交换;    

(2)依次类推,第i趟从a[i-1]开始,通过n-i次比较,从n-i+1个元素中找出最小元素,记为a[min],与a[i-1]交换;    

(3)经过n-1趟排序,算法结束。 

2.简单选择排序举例

例:设待排元素序列为{56,25,70,99,82,10,15,56},请给出简单选择排序法进行排序的过程。

 

3.简单选择排序算法代码 

def selection_sort(self):
    for i in range(0, len(self.data)-1):
        min = i
        for j in range(i + 1, len(self.data)):
          if self.data[min].key > self.data[j].key:
              min = j
        self.data[min], self.data[i] = self.data[i], self.data[min]
def selection_sort(self):
    for i in range(0, len(self.data)-1):
        min = i
        for j in range(i + 1, len(self.data)):
            if self.data[min].key > self.data[j].key:
                min = j
        if min != i:
            self.data[min], self.data[i] = self.data[i], self.data[min]

4.简单选择排序算法分析 

(1)空间复杂度:只在交换的时候需要辅助空间,所以空间复杂度为O(1)。        

(2)时间复杂度:该算法在寻找每趟的最小元素的时候,每一趟需要比较(n-i)次,每次最多做3次移动。                

 总的比较次数为

总的移动次数为

因此时间复杂度为O(n2).

(3)该算法是不稳定算法。

二、堆排序

1.堆排序的基本概念

的概念:        

①如果每个非叶结点值都大于或者等于其孩子结点值,称为大顶堆。        

②如果每个非叶结点值都小于或者等于其孩子结点值,称为小顶堆。        

堆排序把待排序序列中的数据元素看成一棵完全二叉树,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序的序列中选择关键字最大或最小的记录。  

2.大顶堆排序的基本思想 

方法步骤:      

(1)对待排序列数组a进行建堆操作得到大顶堆。      

(2)对a[n-1]和堆顶元素a[0]进行交换操作,从而使得a[n-1]为最大元素。      

(3)将剩下的子序列a[0]到a[n-2]进行调整操作,使得子序列也为大顶堆,然后对a[n-2]和a[0]进行交换操作,从而使得a[n-2]为次大元素。      

(4)以此类推,直到最后交换了a[1]和a[0],得到非递减有序序列,算法结束。

利用堆排序需要解决两个问题:      

(1)如何将n个元素的序列按关键字建成堆;      

(2)输出堆顶元素后,怎样调整剩余元素,使其成为一个新大顶堆。

3.堆排序举例

 例:将数据元素序列{56,25,10,99,82,70,15,56}用大顶堆方法排序。

 

4.堆排序代码 

def heap_sort(self):
    data_len = len(self.data)
    #从最后一个非叶结点开始,将每个非叶结点为根的子树部分调整成堆
        for i in range(data_len // 2 - 1, -1, -1):
        self.sift_down(i, data_len - 1)
    for j in range(data_len-1, 0, -1):
        # 堆顶与j号元素交换
                self.data[0], self.data[j] = self.data[j], self.data[0]
        # 将序列中0号至j-1号部分调整成堆
                self.sift_down(0, j - 1)
def sift_down(self, i, end):
    temp = self.data[i]
    j = 2 * i + 1
    while j <= end:
        if j < end and self.data[j].key < self.data[j + 1].key:
            j = j + 1
        if temp.key > self.data[j].key:
            break
        else:
            self.data[i] = self.data[j]
            i = j
            j = 2 * j + 1
    self.data[i] = temp

 5.堆排序算法分析

(1)空间复杂度:仅需一个元素大小的辅助空间进行交换操作,所以空间复杂度为O(1)。       (2)时间复杂度:O(nlog2n)。      

(3)其他:堆排序只能用于顺序结构,不能用于链式结构,由于初始建堆时比较次数过多,故不适合数据元素较少的情况,在数据元素较多时比较高效。      

(4)堆排序是一种不稳定排序算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896459.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024产品管理新风向:项目管理软件不懂敏捷开发?

一、产品管理与敏捷开发的紧密关联 产品管理和敏捷开发之间存在着紧密的关联&#xff0c;二者相互促进&#xff0c;共同为企业创造价值。 &#xff08;一&#xff09;敏捷开发为产品管理带来的优势 敏捷开发能够极大地加快产品上市速度。在传统的开发模式下&#xff0c;产品…

SAP 关于在交货单进行定价条件的确定简介

SAP 关于在交货单进行定价条件的确定简介 业务场景前台操作1、创建交货单2、创建交货单3、创建发票系统配置1、定义条件类型2、定义并分配定价过程3、定义交货的定价过程确定4、维护开票凭证的复制控制SAP交货单定价是针对销售交货单的价格计算过程,通常包括基本价格、折扣、附…

Java读取PDF后做知识库问答_SpringAI实现

​​​​​​​​​​​​​​ 核心思路&#xff1a; 简单来说&#xff0c;就是把PDF文件读取并向量化&#xff0c;然后放到向量存储里面&#xff0c;再通过大模型&#xff0c;来实现问答。 RAG&#xff08;检索增强生成&#xff09;介绍&#xff1a; 检索增强生成&#x…

数据结构——树、二叉树和森林间的转换

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》129~130页 &#x1f308;每一个清晨&#xff0c;都是世界对你说的最温柔的早安&#xff1a;ૢ(≧▽≦)و✨ 目录 前言 1、基础知识 2…

Qml-Button的使用

Qml-Button的使用 Button属性 Button的继承关系&#xff1a; Button – AbstractButton – Control – Item; Button的属性主要继承于AbstractButton。AbstractButton属性主要如下&#xff1a; a.action:是一个Action类型属性&#xff0c;与QAction类似&#xff0c;用于提供快…

【论文解读系列】EdgeNAT: 高效边缘检测的 Transformer

代码&#xff1a; https://github.com/jhjie/edgenat 论文&#xff1a; https://arxiv.org/abs/2408.10527v1 论文 EdgeNAT: Transformer for Efficient Edge Detection 介绍了一种名为EdgeNAT的基于Transformer的边缘检测方法。 1. 背景与动机 EdgeNAT预测结果示例。(a, b)…

c语言基础程序——经典100道实例。

c语言基础程序——经典100道实例 001&#xff0c; 组无重复数字的数002&#xff0c;企业发放的奖金根据利润提成003&#xff0c;完全平方数004&#xff0c;判断当天是这一年的第几天005&#xff0c;三个数由小到大输出006&#xff0c;输出字母C图案007&#xff0c;特殊图案008&…

【Petri网导论学习笔记】Petri网导论入门学习(七) —— 1.5 并发与冲突

导航 1.5 并发与冲突1.5.1 并发定义 1.14定义 1.15 1.5.2 冲突定义 1.17 1.5.3 一般Petri网系统中的并发与冲突定义 1.18一般网系统中无冲撞概念阻塞&#xff08;有容量函数K的P/T系统&#xff0c;类似于冲撞&#xff09;一般Petri网中并发与冲突共存情况 1.5 并发与冲突 Petr…

lstm基础知识

lstm前言 LSTM(Long short-term memory)通过刻意的设计来避免长期依赖问题&#xff0c;是一种特殊的RNN。长时间记住信息实际上是 LSTM 的默认行为&#xff0c;而不是需要努力学习的东西&#xff01; 在标准的RNN中&#xff0c;这个重复模块具有非常简单的结构&#xff0c;例…

路由器原理和静态路由配置

一、路由器的工作原理 根据路由表转发数据 接收数据包→查看目的地址→与路由表进行匹配找到转发端口→转发到该端口 二、路由表的形成 它是路由器中维护的路由条目的集合&#xff0c;路由器根据路由表做路径选择&#xff0c;里面记录了网段ip地址和对应下一跳接口的接口号。…

【C语言备课课件】(下)指针pointer

目录 定义type *var_name;初始化int *p &a; // p指向变量a的地址 空指针NULL,野指针&#xff0c;指针悬挂 解引用指针的算术运算指针与数组 数组名—首指针二维数组指针 行指针列指针 多级指针&#xff08;进阶&#xff09;数组指针,指针数组&#xff08;进阶&#xff09…

如何利用 Python抓取网页数据 其他方式抓取网页数据列举

在 Python 中可以使用多种方法抓取网页数据&#xff0c;以下是一种常见的方法&#xff0c;使用requests和BeautifulSoup库。 一、安装所需库 在命令提示符或终端中执行以下命令安装requests和BeautifulSoup库&#xff1a; pip install requests pip install beautifulsoup4二…

python——类

问&#xff1a;小编为什么突然开始发python&#xff1f;难道C语言你不行了&#xff1f; 废话少说&#xff0c;让我们进入python中的类的学习&#xff01;&#xff01; &#xff08;一&#xff09;基本知识 &#xff08;1&#xff09;掌握类的概念 1、类的定义&#xff1a; 即…

python安装transformer教程

本章教程,记录在Windows中如何使用python安装transformer。 一、安装依赖 pip install transformers推荐使用国内镜像源,速度会快很多。 二、测试代码 from transformers import pipeline# 加载一个文本生成模型 text_generator = pipe

LCWLAN设备的实际使用案例

我们的LCWLAN设备在实际使用中以裸板的形式放在客户的智能总线控制器中&#xff0c;客户的 智能总线刀片灯&#xff0c;柔性灯货架&#xff0c;柔性感应钢网柜以及智能电子料架等设备都是接到总线控制 器中&#xff0c;然后总控制器通过CAN总线和我们的LCWLAN设备连接&#xff…

Linux DEADLINE调度算法详解

介绍 在实时系统中&#xff0c;调度算法的选择对于任务的及时执行至关重要。为了满足实时性需求&#xff0c;Linux内核引入了不同的调度算法&#xff0c;其中 DEADLINE 调度算法是为硬实时任务而设计的。DEADLINE 调度算法的目标是在多任务的情况下确保任务在其指定的最后期限…

Cpp::STL—容器适配器Stack和Queue的讲解和模拟实现(15)

文章目录 前言一、适配器模式概念分类 二、Stack核心作用代码实现 三、Queue核心作用代码实现 四、deque双端队列貌似兼收并蓄&#xff1f;实则也难以兼得~ 总结 前言 适配器也是STL六大组件之一&#xff0c;请跟我一起领悟它的智慧&#xff01;   正文开始&#xff01; 一、…

如何实现简单的 WinCC 项目分屏?

说明&#xff1a; 本文主要介绍了在不使用分屏器的情况下&#xff0c;通过 WinCC 项目中的设置&#xff0c;实现简单的分屏操作。两台显示器分别显示不同的 WinCC 画面&#xff0c;独自操作&#xff0c;互不影响。 试验环境 &#xff1a; 本文试验时所用硬件及软件环境…

案例分享—国外优秀UI设计作品赏析

国外UI界面设计之所以出色&#xff0c;首要原因在于其注重用户体验。设计师们深入洞察用户需求&#xff0c;通过细致的用户调研和数据分析&#xff0c;确保界面布局、色彩搭配及交互方式都能贴合用户习惯&#xff0c;从而提供流畅、直观的操作体验&#xff0c;增强用户满意度和…

【MySQL】数据库基础、库的操作、表的操作、数据类型

目录 1. 数据库基础1.1 MySQL是什么1.2 使用案例1.3 服务器&#xff0c;数据库&#xff0c;表关系 2. 库的操作2.1 字符集和校验规则2.1.1 查看系统默认字符集以及校验规则2.1.2 查看数据库的字符集和校验规则2.1.3 修改数据库的字符集和校验规则 2.2 库的操作2.2.1 创建数据库…