排序算法学习
文章目录
- 前言
- 一、直接插入排序算法
- 二、折半插入排序算法
- 三、2路插入排序算法
- 四、快速排序算法学习
前言
算法是道路生涯的一个巨大阻碍。今日前来解决这其中之一:有关的排序算法,进行实现以及性能分析。
一、直接插入排序算法
插入排序算法实现主要思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。采用的方法是:在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将新记录插入。
直接上代码实现下,学习代码比学习概念容易的多。
代码例子:对一个数组中的元素最终按照从小到大的顺序排列输出出来。
#include<stdio.h>
//自定义的输出函数
void print(int a[],int n,int i)
{printf("%d:",i);for(int j=0;j<8;j++){printf("%d",a[j]);}printf("\n");
}
//直接插入排序函数
void InsertSort(int a[],int n)
{for(int i=1;i<n;i++){if(a[i]<a[i-1])//若第i个元素大于i-1元素则直接插入;反之,需要找到适当的插入位置后在插入{int j=i-1;int x=a[i];while(j>-1 && x<a[j])//采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间。{a[j+1]=a[j];j--;}a[j+1]=x;}print(a,n,i);}
}
int main()
{int a[4]={3,1,7,5};InsertSort(a,4);
}

写完了代码也差不多了解了直接插入排序算法。比如上面我们写的代码实例是按照从小到大的顺序排序。
实现的时候,遍历所有元素,看看这个元素要插入的位置的前一个元素是否比它小,如果是的话直接插入。否则,,采用顺序遍历查找,向前遍历寻找这个元素要插入的位置,并且将数组中的元素都进行后移操作,给这个要插入的元素腾出空间。(元素的整体后移)
时间复杂度O(n^2)
二、折半插入排序算法
#include<stdio.h>
void print(int a[],int n,int i)
{printf("%d:",i);for(int j=0;j<n;j++){printf("%d",a[j]);}printf("\n");
}
void BInsertSort(int a[],int size)
{int i,j,low=0,high=0,mid;int temp=0;for(i=1;i<size;i++){low=0;high=i-1;temp=a[i];//采用折半查找法判断插入的位置,最终变量low表示插入位置while(low<=high){mid=(low+high)/2;if(a[mid]>temp){high=mid-1;}else{low=mid+1;}}//有序表中插入位置后的元素统一后移for(j=i;j>low;j--)a[j]=a[j-1];a[low]=temp;print(a,8,i);}
}
int main()
{int a[8]={3,1,7,5,2,4,9,6};BInsertSort(a,8);
}
这其实就是把上面的直接遍历换成了二分法寻找
折半插入排序算法相比较于直接插入排序 算法,只是减少了关键字间的比较次数,而记录的移动次数没有进行优化,所以时间复杂度仍然是O(n^2);
三、2路插入排序算法
2-路插入排序算法的具体实现思路为:另外设置一个同存储记录的数组大小相同的数组d,将无序表中第一记录添加进d[0]的位置上,然后从无序表中第二个记录开始,同的d[0]做比较:如果该值比d[0]大,则添加到其右侧;反之添加到其左侧。
接着用上面代码进行改版:
#include<stdio.h>
#include<stdlib.h>
void insert(int arr[],int temp[],int n)
{int i,first,final,k;first=final=0; //分别记录temp数组中最大值和最小值的位置temp[0]=arr[0];for(i=1;i<n;i++){//待插入元素比最小的元素小if(arr[i]<temp[first]){first=(first-1+n)%n;temp[first]=arr[i];}//待插入元素比最大元素大else if(arr[i]>temp[final]){final=(final+1+n)%n;temp[final]=arr[i];}//插入元素比最小大,比最大小else{k=(final+1+n)%n;//当插入值比当前值小时,需要移动当前值的位置while(temp[((k-1)+n)%n]>arr[i]){temp[(k+n)%n]=temp[(k-1+n)%n];k=(k-1+n)%n;}//插入该值temp[(k+n)%n]=arr[i];//因为最大值的位置改变,所以需要实时更新final的位置final=(final+1+n)%n;}}//将排序记录复制到原来的顺序表里for(k=0;k<n;k++)arr[k]=temp[(first+k)%n];
}
int main()
{int a[8]={3,1,7,5,2,4,9,6};int temp[8];insert(a,temp,8);for(int i=0;i<8;i++)printf("%d",a[i]);return 0;
}

四、快速排序算法学习
快速排序算法实现的基本思想是:通过一次排序将整个无序表分成相互独立的两部分,其中一部分中的数据都比另一部分中包含的数据的值小,然后继续沿用此方法分别对两部分进行同样的操作,直到每一个小部分不可再分,所得到的整个序列就成为了有序序列。
具体步骤如下:
(1)先从数列中取出一个元素作为基准数
(2)扫描数列,将比基准数小的元素全部放到它的左边,大于或等于基准数的元素全部放到它的右边,得到左右两个区间。
(3)再对左右区间重复第二步,直到各区间少于两个元素。
接下来通过图片展示一次这个步骤,相信剩下的应该也就理解了。
如下实例:
(1)以数组的第一个元素作为基准数,取出来,进行另存

(2)从区间的最右边找个比这个基准数小 的数,放到 它这个位置,如下图是找到了19.

放到原基准数的位置

(3)然后再在区间的最左边开始找比基准数大的元素找到了就放到R空的那个位置
如下图是找到了47

放到R空的位置

(4)如此这么循环,直到L和R相遇,把这个基准数填到相遇的位置

这样基准数的左边都比基准数小,基准数右边的都比基准数大。
如此这么递归,把所有区间递归完,即排完序了。
接下来我们看下代码:
代码实例中,我特地没在数组的第一个位置存储元素,特地用它来存储这个移出来,等待插入的基准数
#include<stdio.h>
#include<stdlib.h>
#define MAX 9
//单个记录的结构
typedef struct
{int key;
}SqNote;
//记录表的结构体
typedef struct
{SqNote r[MAX];int length;
}SqList;
int Partition(SqList *L,int low,int high)
{L->r[0]=L->r[low]; //下标为0的位置存放提取出来的基节点int pivotkey=L->r[low].key;//直到两指针相遇,程序结束while(low<high) {//high指针左移,直到遇到比pivotkey值小的记录,指针停止移动while(low<high && L->r[high].key>=pivotkey){high--; } //直接将high指向的小于支点的记录移动到low指针的位置L->r[low]=L->r[high];//low指针右移,直到遇到比pivotkey值大的记录,指针停止移动 while(low<high && L->r[low].key<=pivotkey){low++; } //直接将low指向的大于支点的记录移动到high指针的位置L->r[high]=L->r[low]; }//将支点添加到准确的位置L->r[low]=L->r[0];return low;
}
void QSort(SqList *L,int low,int high)
{if(low<high){//找到支点的位置int pivotloc=Partition(L,low,high);//对支点左侧的子表进行排序QSort(L,low,pivotloc-1);//对支点右侧的子表 进行排序QSort(L,pivotloc+1,high); }
}
void QuickSort(SqList *L)
{QSort(L,1,L->length);
}
int main()
{SqList *L=(SqList*)malloc(sizeof(SqList));L->length=8;L->r[1].key=49;L->r[2].key=38;L->r[3].key=65;L->r[4].key=97;L->r[5].key=76;L->r[6].key=13;L->r[7].key=27;L->r[8].key=49;QuickSort(L);for(int i=1;i<=L->length;i++)printf("%d",L->r[i].key);return 0;
}
快速排序算法的时间复杂度为O(nlogn),是所有时间复杂度相同的排序方法中性能最好的排序算法。
相关文章:
排序算法学习
文章目录前言一、直接插入排序算法二、折半插入排序算法三、2路插入排序算法四、快速排序算法学习前言 算法是道路生涯的一个巨大阻碍。今日前来解决这其中之一:有关的排序算法,进行实现以及性能分析。 一、直接插入排序算法 插入排序算法实现主要思想…...
常见漏洞之 struts2+ jboss
数据来源 本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。 01 Struts2相关介绍 》Struts2概述 》Struts2历史漏洞(1) 》…...
leetcode470 用Rand7()实现Rand10()
力扣470 第一步:根据Rand7()函数制作一个可以随机等概率生成0和1的函数rand_0and1 调用Rand7()函数,随机等概率生成1,2,3,4,5,6,7 这时我们设置:生成1,2&a…...
JSON数据解析商品详情API
大家有探讨稳定获取商品主图、jiage、标题,及sku的完整解决方案。这个引起了我技术挑战的兴趣,然后各种网上资料查询,最终还是不负努力,找到更好的解决方案,不再出现任何滑块验证码,完全绕过,实…...
服务端开发Java面试复盘篇1
上周投了一些简历,约了8-9家面试,其中完成了3家的第一轮面试,由于面试的是Java 的实习生,感觉问的题目都比较基础,不过有些问题回答的不是很好,在这里对回答的不太好的题目做一下总结和复盘。 目录 一、后…...
Android框架WiFi架构
同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 一、wpa_supplicant:wpa_supplicant本身开源项目源码,被谷歌收购之后加入Android移…...
rt-thread 移植调试记录
rt-thread 移植调试记录 记录rt-thread移植的过程。这里移植仅仅是利用rt-thread源码目录已经移植好的文件,组建自己的工程,不需要自己编写汇编完成底层移植。 1. 搭建基础工程 这里使用的是正点原子的潘多拉开发板,MCU为stm32l475。需要先…...
红外线额温枪与红外线温度传感器的原理分析
额温枪主要针对测量人体额温基准而设计,使用也非常简单方便。测体温可以达到一秒即可准确测量。并且不需要接触人体,隔着空气即可一键测温。非常适合家庭、学校、企业等场所。 但是由于其精度原因(一般为 0.2 ℃,也有更低的&#…...
2023牛客寒假算法集训营4
目录A. [清楚姐姐学信息论](https://ac.nowcoder.com/acm/contest/46812/A)(数学)B. [清楚姐姐学构造](https://ac.nowcoder.com/acm/contest/46812/B)(数学 构造)C. [清楚姐姐学01背包(Easy Version)](https://ac.nowcoder.com/…...
vue组合式API及生命周期钩子函数
一、组合式API 什么是组合式API? vue3中支持vue2的选项式、支持新的编程模式–函数式编程(没有this指针)做了一个兼容,可以在一个组件中使用函数式编程和OOP编程(选项式) setup()函数 可以使用setup属性…...
Python|每日一练|数组|回溯|二分查找|排序和顺序统计量|.update方法 |单选记录:组合总和|寻找峰值|编程通过键盘输入每一位运动员
1、组合总和(数组、回溯) 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 t…...
minio下载文件速度很慢的原因分析与说明
文章目录1.实战背景2.问题描述3.问题分析4.问题解决1.实战背景 最近在做一个项目,需要用到minio来搭建文件系统,先简单说一下我在项目中设置的上传文件流程: 前端将分块文件逐一传给后端,后端再存储到 linux服务器的minio 当中。…...
基于comsol软件弯曲单模光纤模拟仿真
在本节中,主要基于实验室实际光纤单模圆柱光纤进行模拟,与comsol案例库文件在分析过程和建模有些差异: 模拟主要通过以下三个步骤进行:模型的几何构建、物理场的添加研究、结构处理分析来进行。 下面是第一步骤:几何…...
如何开启多个独立Chrome浏览器
一、简介 作为测试或者开发人员,有些情况下会用到 Chrome 浏览器,但有时是同一个 Chrome 浏览器无法为我们提供隔离开的不同环境。这样 我们就需要清理 cache 、切换账号等,降低了我们的工作效率。今天的主题是如何开启多个独立的 Chrome 浏…...
erp5开源制造业erp主要业务会计分录处理
erp5开源制造业erp主要业务会计分录处理 采购业务的会计分录 收到发票时 借:材料采购 (1201) 应交税费-应交增值税(进项税)(21710101) 贷:应付账款 (2121) 付款时 借:应付账款 (2121) 贷:银行存款 (1002) 入…...
技能树基础——17四平方和(拉格朗日定理,嵌套循环)
题目:四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。比如:5 0^ 2 0^ 2 1^ 2 2^27 1^ 2 1^ 2 1^ 2 2^2 (^符号表…...
JPA、EJB、事物管理---相关内容整理
目录 ■前言 ■实现原理:容器管理事务 ■代码实现简单描述: 1.JPA ■定义 ■1.1.配置文件 ■1.2.OSS jar ■1.3.一些OPA的类(举例) ■1.4. jpa 框架在实体类(Entity)中添加非数据库字段的属性--…...
C语言学习笔记(一):了解C语言
什么是C语言 C语言是一种高级编程语言,最早由丹尼斯里奇在1972年开发。它是一种通用编程语言,提供了高级编程语言的方便和易用性,同时又有较低级别的编程语言的灵活性和效率。C语言在许多操作系统、编译器和应用程序开发中广泛使用ÿ…...
回头看——《智能家居项目小结》
openAI兴起,于是拿着之前小组合作的项目(承认优化较差),交给AI试着帮忙优化下1.功能函数(TCP_SER_INIT)优化源代码:int TCP_SER_INIT(int *tcpsocket, const char *ip, const char *…...
社交登陆OAuth2.0
QQ、微博、github 等网站的用户量非常大,别的网站为了 简化自我网站的登陆与注册逻辑,引入社交登陆功能; 步骤: 1)、用户点击 QQ 按钮 2)、引导跳转到 QQ 授权页 3)、用户主动点击授权ÿ…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
