选择/插入/冒泡/快速排序之R语言实现
题目来自于《R语言的科学编程与仿真》第9章第7题。
- 选择排序法。这是一种最简单,但是效率最低的排序算法。算法步骤如下:
- 对于给定的一个向量x,令最初的未排序向量u等于x,并且最初的已排序向量s的长度为0。
- 寻找u中的最小元素,然后把它从u中移出来,放在向量s的最末端。
- 重复执行第2步,直至u中没有元素为止。
显然,此时若给出一个可以返回一个向量最小元素的函数会使整个过程变得非常方便。代码如下:
#choose sort method
minR<-function(x){
num<-length(x)
if(num==1){return(x)
}else{
x_min<-x[1]
for(i in 2:length(x)){
if(x_min>x[i]){x_min<-x[i]}
}
return(x_min)
}
}#最小值函数minR() choose_sort<-function(x){
u<-x
s<-c()
while(length(u)>0){
u_min<-minR(u)
s<-c(s,u_min)
u<-u[-which(u==u_min)[1]]
}
return(s)
}
choose_sort(c(rep(1,1000),rep(0,1000),rep(2,1000)))
- 插入排序法。与选择排序法类似,算法步骤如下:
- 对于给定的一个向量x,令最初的未排序向量u等于x,并且最初的已排序向量s的长度为0。
- 将u中的最后一个元素插入s中,并且保持s是有序的。
- 重复执行第2步,直至u中没有元素为止。
将一个元素a插入到一个有序向量s=(b1,...,bk)中(类似于上述第2步的过程),通常我们并不需要考虑向量中的每一个元素。实际上,如果我们从向量的尾部开始搜索,我们只要找出第一个使得a≥bi的i就可以了,然后就可以得到一个新的有序向量(b1,...,bi,a,bi+1,...,bk)。代码如下:
#insert sort method
insert_sort<-function(x){
if(length(x)==1){return(x)}
u<-x[-length(x)]
s<-x[length(x)]
while(length(u)>0){
n<-length(u)
s1<-s[s-u[n]<0]
s2<-s[s-u[n]>=0]
s<-c(s1,u[n],s2)#保持s的顺序
u<-u[-n]
}
return(s)
}
- 冒泡排序法。冒泡排序法和选择排序法与插入排序法还是有很大区别的。它的执行方式是不断地对向量x=(a1,...,an)相邻元素进行比较,具体步骤如下:
- 对于i=1,...,n-1,如果ai>ai+1,则交换ai和ai+1的位置。
- 重复执行第1步,直到没有需要交换的为止。
代码实现如下:
#bubble sort method
bubble_sort<-function(x){
num<-length(x)
if(num==1){return(x)
}else{
finished<-FALSE
while(!finished){
m<-x
for(i in 1:(num-1)){
s<-x
if(x[i]>x[i+1]){
s[i]<-x[i+1]
s[i+1]<-x[i]}
x<-s
}
finished<-sum(s==m)==num#判断是否不存在需要交换的元素
}
return(x)
}
}
- 快速排序法。快速排序法可以说是目前(平均)排序最快的算法之一,也是被广为使用的一种排序方法。这个方法最初于1960年由C.A.R.霍尔提出,其采取的是“分治算法”策略:使用递归算法的思想将一个问题分解成两个小(容易)的问题来处理。给定一个向量x=(a1,...,an),算法的具体步骤如下:
- 如果n=0或者n=1,则对x的排序完成,计算结束。
- 如果n>1,则将向量(a1,...,an)分割成lower和upper两个子向量,其中lower包含x中所有小于a1的元素,upper包含x中所有大于a1的元素(等于a1的元素放在lower或upper中均可)。
- 对lower和upper进行排序。记这两个子向量排好序后的向量分别为(b1,...,bi)和(c1,...,cj),则向量x排好序后的结果为(b1,...,bi,a,c1,...,cj)。
使用递归函数来实现快速排序法的过程,代码如下:
#quick sort method
quick_sort<-function(x){
num<-length(x)
if(num==0||num==1){return(x)
}else{
a<-x[1]
y<-x[-1]
lower<-y[y<a]
upper<-y[y>=a]
return(c(quick_sort(lower),a,quick_sort(upper)))}#递归
}
接下来测试比较一下吧。
test<-c(rep(1,1000),rep(0,1000),rep(2,1000))
system.time(choose_sort(test))
#user system elapsed
#0.39 0.00 0.39 system.time(insert_sort(test))
#user system elapsed
#0.14 0.00 0.14 system.time(bubble_sort(test))
#user system elapsed
#7.61 0.05 7.78 system.time(quick_sort(test))
#user system elapsed
0.07 0.00 0.08
排序结果都是对的,貌似冒泡排序写得不好,有点慢,快速排序确实是最快的。
选择/插入/冒泡/快速排序之R语言实现的更多相关文章
- 第五篇:R语言数据可视化之散点图
散点图简介 散点图通常是用来表述两个连续变量之间的关系,图中的每个点表示目标数据集中的每个样本. 同时散点图中常常还会拟合一些直线,以用来表示某些模型. 绘制基本散点图 本例选用如下测试数据集: 绘制 ...
- php四种基础算法:冒泡,选择,插入和快速排序法
转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一 ...
- C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)
算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...
- 冒泡,选择,插入,快速排序在Java中的实现
近几天再重新看数据结构的书时,根据各种排序的空间复杂度,发现快速排序所用时间是最短的,也即是说快速排序的速度最快.因此想验证一下具体这几个排序发的快慢,所以在Java中得以实现,同时在运行时,发现虽然 ...
- php四种基础算法:冒泡,选择,插入和快速排序法PHP基础教程
许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西.但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌 ...
- php 冒泡 快速 选择 插入算法 四种基本算法
php四种基础算法:冒泡,选择,插入和快速排序法 来源:PHP100中文网 | 时间:2013-10-29 15:24:57 | 阅读数:120854 [导读] 许多人都说 算法是程序的核心,一个程序 ...
- python 数据结构与算法之排序(冒泡,选择,插入)
目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...
- R语言统计分析技术研究 特征值选择技术要点
特征值选择技术要点 作者:王立敏 文章来源: 网络 1.特征值 特征值是线性代数中的一个重要概念.在数学,物理学,化学,计算机等领域有着广泛的应用. ...
- 几种经典排序算法的R语言描述
1.数据准备 # 测试数组 vector = c(,,,,,,,,,,,,,,) vector ## [] 2.R语言内置排序函数 在R中和排序相关的函数主要有三个:sort(),rank(),ord ...
- R语言作为BI中ETL的工具
R语言作为BI中ETL的工具,增删改 R语言提供了强大的R_package与各种数据库进行数据交互. 外加其强大数据变换清洗函数,为ETL提供一条方便快捷的道路. RODBC ROracal RMys ...
随机推荐
- 【C++复习】运算符重载中的特殊运算符
无法被重载 类属关系运算符 . 成员指针运算符 .* 作用域分辨符 :: 三目运算符 ?: 只能通过成员函数重载 赋值运算符= 方括号[] 圆括号() 指向结构体成员运算符->
- [网鼎杯2020]boom
[网鼎杯2020]boom 分析 感觉比较友善,主要考查数学运算. 解析 解压之后发现是个exe文件,运行得到一个md5 查询: 输入明文得到: 下个挑战是解三元一次方程: 拿matlab算一下. s ...
- Pygame的基本应用(14周)
制作一个跳跃的小球游戏 创建一个游戏窗口,然后在窗口内创建一个小球.以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续移动.代码如下: import sysimport p ...
- oracle通过计划任务备份表
1.先手动创建表 create table user01_backup_20210204 select * from user01 commit; 2.清空表 truncate table user0 ...
- [BOM] 封装一下cookie
function get_cookie(key) { var arr, reg = new RegExp("(^| )" + key + "=([^;]*)(;|$)&q ...
- allure安装配置
代理节点配置allure 下载allure https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline 配置环境变 ...
- oracle system 账户被锁或者忘记密码
首先打开SQL PLUS 然后执行conn /as sysdba,不用输入口令直接登录. 登录成功! 若登录的时候出错,这是由于权限不足. 接下来打开[计算机管理],选择[本地用户和组],展开[组], ...
- java SE01
目录 一.基础语言 1. 注释 a. 行内注释 b. 多行注释 c. 文档注释 2. 关键字 3. 数据类型 a.基本数据类型 b.引用数据类型 c. 类型转换 4. 变量类型 a. 类变量 b. 实 ...
- java 将yyyyMMddHHmmss转化为yyyy-MM-dd HH:mm:ss格式的字符串
思路很简单:先转化为yyyyMMddHHmmss格式的Date类型,再格式化为yyyy-MM-dd HH:mm:ss格式的字符串类型 import java.text.DateFormat; impo ...
- 钉钉获取群openConversationId方式以及企业内部机器人发送群消息
https://open-dev.dingtalk.com/apiExplorer#/jsapi?api=biz.chat.chooseConversationByCorpId 通过上述URL进入钉钉 ...