选择/插入/冒泡/快速排序之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 ...
随机推荐
- python之定时任务APScheduler
一.APScheduler APScheduler全称Advanced Python Scheduler 作用为在指定的时间规则执行指定的作业. 指定时间规则的方式可以是间隔多久执行,可以是指定日期时 ...
- 对服务器进行心跳检测 python django
(由于春节期间连不上服务器,但又不知道是不是服务器关机了,因此写一个心跳检测功能遇到问题时可以排查部分原因) 具体来说分为客户端和服务端,客户端为校园服务器,服务端为我们自己搭建的http服务器.客户 ...
- s-hr实现单点登录,看我这份笔记就够了!!!
https://pan.kingdee.com/s/MTA5ODk4NyxjNzk1来自:云之家企业云盘
- 统计tomcat的access日志
统计tomcat的access日志的ip次数,并按次数排序 awk '{sum[$1]++}END{for(i in sum) print i "\t" sum[i]}' loca ...
- Nacos安装与启动
一.官网下载 1. 地址 https://github.com/alibaba/nacos/releases 二.安装 将下载的安装包解压至非中文目录即可,解压后目录: bin 目录下有启动脚本, ...
- 最新2019Java调用百度智能云人脸识别流程
首先先注册账户 https://console.bce.baidu.com/?fromai=1#/aip/overview 点击链接 有账户直接登录 如无 则注册 进入控制台后 点击人脸识别 随便选 ...
- mysql正则替换 正宗!
先看个官方例子 mysql> SELECT REGEXP_REPLACE('a b c', 'b', 'X'); +-----------------------------------+ | ...
- C# 将Dll文件打包到exe中
首先在资源管理里面将需要使用的dll添加进入 然后将dll文件的生成操作改成嵌入的资源 然后新建一个类 LoadResourceDll.cs 1 using System; 2 using Syst ...
- js导出数据为excel表
1.接口数据后端写, 2.代码如下: var params={ "filters":[ {"propertyCode":"sequenceNo&quo ...
- webpack 5 配置babel-loader babel7
1.安装Balel目的: 在webpack中 默认只能处理部分 ES6的新语法,一些更高级的ES6或ES7的语法,webpack是处理不了的这个时候就需要借助第三方的loader 来帮助webpack ...