数据结构之简单排序

数据结构之简单排序

  • 1、直接插入排序
  • 2、冒泡排序
  • 3、简单选择排序

  数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
  假设含 n个记录的文件内容为{R 1,R 2,…,R n},相应的关键字为{k 1,k 2,…,k n}。经过排序确定一种排列{R j1,R j2,…,R jn},使得它们的关键字满足以下递增(或递减)关系:k j1≤k j2≤…≤k jn(或k j1≥k j2≥…≥k jn)。
  若在待排序的一个序列中,R i 和 R j 的关键字相同,即k i=k j,且在排序前 R i 领先于R j,那么在排序后,如果R i 和R j 的相对次序保持不变,R i 仍领先于R j,则称此类排序方法为稳定的。若在排序后的序列中有可能出现R j 领先于R i 的情形,则称此类排序为不稳定的。
  (1)内部排序。内部排序指待排序记录全部存放在内存中进行排序的过程。
  (2)外部排序。外部排序指待排序记录的数量很大,以至于内存不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。
  在排序过程中需要进行下列两种基本操作:比较两个关键字的大小;将记录从一个位置移动到另一个位置。前一种操作对大多数排序方法来说都是必要的,后一种操作可以通过改变记录的存储方式来避免。

1、直接插入排序

  直接插入排序是一种简单的排序方法,具体做法是:在插入第 i 个记录时,R1、R2、…、Ri-1 已经排好序,这时将 Ri 的关键字 ki 依次与关键字 ki-1、ki-2 等进行比较,从而找到应该插入的位置并将 Ri 插入,插入位置及其后的记录依次向后移动。
  【算法】直接插入排序算法。

void Insertsort(int data[],int n)
/*将数组data[0]~data[n-1]中的n个整数按非递减有序的方式进行排列*/
{inti,j;int tmp;for(i=1; i<n; i++){if(data[i] <data[i-1]){tmp=data[i];  data[i]=data[i-1];for(j=i-1; j>=0&&data[j]>tmp; j--)   data[j+1]=data[j];data[j+1]=tmp;}/*if*/}/*for*/
}/*Insertsort*/

  直接插入排序法在最好情况下(待排序列已按关键码有序),每趟排序只需作 1 次比较目不需要移动元素,因此 n 个元素排序时的总比较次数为 n-1 次,总移动次数为 0 次。在最坏情况下(元素已经逆序排列),进行第 i 趟排序时,待插入的记录需要同前面的 i 个记录都进行 1 次比较,因此,总比较次数为 Σ i = 1 n − 1 i = n ( n − 1 ) 2 {\huge \Sigma}_{i=1}^{n-1}i=\frac{n(n-1)}2 Σi=1n1i=2n(n1)。排序过程中,第 i 趟排序时移动记录的次数为 i+1(包括移进、移出tmp),总移动次数为 Σ i = 2 n ( i + 1 ) = ( n + 3 ) ( n − 2 ) 2 {\huge \Sigma}_{i=2}^{n}(i+1)=\frac{(n+3)(n-2)}2 Σi=2n(i+1)=2(n+3)(n2)
  直接插入排序是一种稳定的排序方法,其时间复杂度为O(n2)。在排序过程中仅需要一个元素的辅助空间,空间复杂度为O(1)。

2、冒泡排序

  n个记录进行冒泡排序的方法是:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换这两个记录的值,然后比较第二个记录和第三个记录的关键字,依此类推,直到第n-1个记录和第n个记录的关键字比较过为止。上述过程称为第一趟冒泡排序,其结果是关键字最大的记录被交换到第n个记录的位置上。然后进行第二趟冒泡排序,对前n-1 个记录进行同样的操作,其结果是关键字次大的记录被交换到第 n-1个记录的位置上。最多进行n-1 趟,所有记录有序排列。若在某趟冒泡排序过程没有进行相邻位置的元素交换处理,则可结束排序过程。
  冒泡排序法在最好情况下(待排序列已按关键码有序),只需做 1 趟排序,元素的比较次数为 n-1 且不需要交换元素,因此总比较次数为 n-1 次,总交换次数为 0次。在最坏情况下(元素已经逆序排列),进行第 j 趟排序时,最大的 j-1 个元素已经排好序,其余的 n-(j-1) 个元素需要进行 n-j 次比较和 n-j 次交换,因此总比较次数为 Σ j = 1 n − 1 ( n − j ) = n ( n − 1 ) 2 {\huge \Sigma}_{j=1}^{n-1}(n-j)=\frac{n(n-1)}2 Σj=1n1(nj)=2n(n1),总交换次数为 Σ j = 1 n − 1 ( n − j ) = n ( n − 1 ) 2 {\huge \Sigma}_{j=1}^{n-1}(n-j)=\frac{n(n-1)}2 Σj=1n1(nj)=2n(n1)
  冒泡排序是一种稳定的排序方法,其时间复杂度为O(n2)。在排序过程中仅需要一个元素的辅助空间用于元素的交换,空间复杂度为O(1)。

3、简单选择排序

  n个记录进行简单选择排序的基本方法是:通过 n-i(1≤i≤n)在次关键字之间的比较,从n-i+1 个记录中选出关键字最小的记录,并和第 i 个记录进行交换,当 i 等于 n 时所有记录有序排列。
  【算法】简单选择排序算法。

void SelectSort(int data[], int n)
/*将数组data中的n个整数按非递减有序的方式进行排列*/
{int i,j, k,tmp;for(i=0; i<n-1; i++){k=i;for(j=i+1; j<n; j++)				/*找出最小关键字的下标*/if(data[j]<data[k])	k=j;if(k!=i){tmp=data[i];	data[i]=data[k];	data[k]=tmp;}/*if*/}/*for*/
}/*SelectSort*/

简单选择排序法在最好情况下(待排序列已按关键码有序),不需要移动元素,因此 n个元素排序时的总移动次数为0次。在最坏情况下(元素已经逆序排列),前 n 2 \frac n2 2n趟中,每趟排序移动记录的次数都为3次(两个数组元素交换值),其后不再移动元素,共进行n-1趟排序,总移动次数为3(n-1)/2。无论在哪种情况下,元素的总比较次数为 Σ i = 1 n − 1 ( n − i ) = n ( n − 1 ) 2 {\huge \Sigma}_{i =1}^{n-1}(n-i)=\frac{n(n-1)}2 Σi=1n1(ni)=2n(n1)
  简单选择排序是一种不稳定的排序方法,其时间复杂度为 O(n2)。在排序过程中仅需要一个元素的辅助空间用于数组元素值的交换,空间复杂度为O(1)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2 对接 海康摄像头插件 (视频WEB插件 V1.5.2)

前言 海康视频插件v.1.5.2版本运行环境需要安装插件VideoWebPlugin.exe&#xff0c;对浏览器也有兼容性要求&#xff0c;具体看官方文档 对应下载插件 去海康官网下载插件 里面有dome等其他需要用到的 地址&#xff1a; 安装插件 打开下载的文件里的bin文件 安装一下Video…

修改Vim编辑器的缩进和显示行数

一、Vim编辑器的缩进和显示行数 1.指令 sudo vi /etc/vim/vimrc2.插入内容 set tabstop4 set shiftwidth4 set nu 注意输入的格式&#xff0c;前后不要留空格 tabstop是输入按下tab缩进4个 shiftwidth是批量缩进4个 nu是显示行数

革命性的写作:MDX 让你的 Markdown 全面动起来

1. MDX MDX 是一种标记语法&#xff0c;它结合了 Markdown&#xff08;一种流行的文本到 HTML 的转换工具&#xff09;和 JSX&#xff08;React 中用于描述 UI 组件的语法扩展&#xff09;。MDX 允许你在 Markdown 文档中直接写入 JSX&#xff0c;这意味着你可以在 Markdown 内…

IPv6协议讲解

IPv6协议讲解 IPv6是互联网协议的第六版(Internet Protocol Version 6)&#xff0c;它用于在互联网上路由数据包&#xff0c;旨在替代IPv4&#xff0c;它提供了更多的IP地址和改进的网络功能。IPv6是为了应对互联网快速发展带来的挑战而设计的&#xff0c;它的引入不仅解决了地…

【教学类-40-08】A4骰子纸模制作8.0(2.97CM嵌套骰子表格相连 一页7个 油墨打印A4铅画纸)

作品展示&#xff08;一页7个骰子&#xff0c;表格连在一起&#xff0c;一行一个&#xff08;2嵌套&#xff09;&#xff09; 背景需求&#xff1a; 制作三嵌套盒子并实践后&#xff0c;感觉套起来很紧&#xff0c;还是用2嵌套的铅画纸做骰子比较好&#xff0c; https://blog…

C++新特性 线程局部存储

本篇文章来介绍一下关于线程局部存储的一些概念 线程局部存储&#xff08;Thread Local Storage&#xff0c;TLS&#xff09;是一种编程技术&#xff0c;用于为每个线程提供独立的变量副本。它允许在多线程程序中创建全局变量的多个实例&#xff0c;每个实例都与特定的线程相关…

代码随想录算法训练营|day24

第七章 回溯算法 77.组合代码随想录文章详解总结 77.组合 以n5,k3为例 (1)for循环遍历&#xff0c;递归选择符合要求的值加入path&#xff0c;len(path)k时&#xff0c;返回 statrtIndex保证每次递归取到的值不重复 剪枝&#xff1a;i<n-(k-len(path))1 后续需要k-len(pat…

政安晨的AI笔记——示例演绎OpenAI的ChatGPT与DALL·E提示词总原则(并融合创作一副敦煌飞天仙女图)

ChatGPT是由OpenAI开发的一种基于大规模预训练的语言生成模型。它建立在GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的基础上&#xff0c;通过大量的无监督学习和生成式任务训练来学习语言的概念和模式。 ChatGPT的原理是基于Transformer模型。Transfo…

shell命令以及运行原理 | 权限

Shell命令原理剖析 shell命令以及运行原理&#x1f4a6;Linux权限的概念&#x1f4a6;什么是权限❔Linux下有哪些权限身份❔Linux中文件属性解析 shell命令以及运行原理&#x1f4a6; Linux严格意义上说的是一个操作系统&#xff0c;我们称之为 “核心&#xff08;kernel"…

AS-V1000 视频监控平台产品介绍:客户端功能介绍(一)

目 录 一、引言 1.1 AS-V1000视频监控平台介绍 1.2平台服务器配置说明 二、软件概述 2.1 客户端软件用途 2.2 客户端功能 三、客户端功能说明 3.1 登陆和主界面 3.1.1登陆界面 3.1.2登陆操作 3.1.3主界面 3.1.4资源树 3.2 视频预览 3.2.1视频预览界面 3.2.…

京东微前端框架MicroApp简介

一、MicroApp 1.1 MicroApp简介 MicroApp是由京东前端团队推出的一款微前端框架,它从组件化的思维,基于类WebComponent进行微前端的渲染,旨在降低上手难度、提升工作效率。MicroApp无关技术栈,也不和业务绑定,可以用于任何前端框架。 官网链接:https://micro-zoe.gith…

获取真实 IP 地址(一):判断是否使用 CDN(附链接)

一、介绍 CDN&#xff0c;全称为内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;是一种网络架构&#xff0c;旨在提高用户对于网络上内容的访问速度和性能。CDN通过在全球各地部署分布式服务器节点来存储和分发静态和动态内容&#xff0c;从而减少…

【Linux系统化学习】进程替换

目录 进程程序替换 替换原理 ​编辑替换函数 函数解释 命名理解 函数使用 execl execlp execv execvp 调用其它程序 进程程序替换 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个…

uboot 模拟 pc BIOS的 跑码诊断

/* * armboot - Startup Code for ARM920 CPU-core * * Copyright (c) 2001 Marius Gr鰃er <magsysgo.de> * Copyright (c) 2002 Alex Z黳ke <azusysgo.de> * Copyright (c) 2002 Gary Jennejohn <garyjdenx.de> * * See file CREDITS f…

禁止 ios H5 中 bounces 滑动回弹效果

在开发面向 iOS 设备的 HTML5 应用时&#xff0c;控制页面的滚动行为至关重要&#xff0c;特别是禁用在 Safari 中默认的滑动回弹效果。本文旨在提供一个简洁明了的解决方案&#xff0c;帮助开发者在特定的 Web 应用中禁用这一效果。 1. 什么是滑动回弹效果&#xff1f; 在 iO…

C++输出地址

下面是一段输出地址的程序。 #include <bits/stdc.h> using namespace std;int main() {int s;cout << &s;//原地址return 0; }假如有一个人&#xff08;的朋友&#xff09;后来了&#xff0c;他也想住进的房间&#xff0c;我们可以这样&#xff1a; #includ…

从ORA-00283 ORA-16433报错开始恢复---惜分飞

接手一个客户无法正常启动的故障数据库&#xff0c;尝试recover 报ORA-00283 ORA-16433错误 [oraclexff trace]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sat Jan 27 04:46:23 2024 Copyright (c) 1982, 2014, Oracle. All rights reserved. ??…

docker 运行jar包

要在Docker中运行JAR包&#xff0c;你可以使用以下步骤&#xff1a; 创建一个Dockerfile&#xff0c;指定基础镜像和设置工作目录。例如&#xff1a; # 使用官方Java镜像作为基础镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR /app 将JAR包复制到容器中的/app目录。…

【数据结构】链表OJ面试题2(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 休息一天&#xff0c;今天继续刷题&#xff01; 2.OJ题目训练 1. 编写代码&#xff0c;以给定值x为基准将链表分割成两部分&#xff0c;所有小于x的结点排在大于或等于x的结点之前 。链表分割_牛客题霸_牛客网 思路 既然涉及…

gif动图的裁剪实现思路

项目需求(对app的轮播,以及banner和咨询的图片进行裁剪):前期实现使用用vue-cropper插件对图片进行插件,----后续需求需要裁剪gif动图(vue-cropper、微信自带的截图工具,以及fastStone截图工具,都只能截取静态图片,打开动图时只显示某一帧的静态图片),所以需要研究为什么vue-cr…