题目来自于《R语言的科学编程与仿真》第9章第7题。

  • 选择排序法。这是一种最简单,但是效率最低的排序算法。算法步骤如下:
  1. 对于给定的一个向量x,令最初的未排序向量u等于x,并且最初的已排序向量s的长度为0。
  2. 寻找u中的最小元素,然后把它从u中移出来,放在向量s的最末端。
  3. 重复执行第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)))
  • 插入排序法。与选择排序法类似,算法步骤如下:
  1. 对于给定的一个向量x,令最初的未排序向量u等于x,并且最初的已排序向量s的长度为0。
  2. 将u中的最后一个元素插入s中,并且保持s是有序的。
  3. 重复执行第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)相邻元素进行比较,具体步骤如下:
  1. 对于i=1,...,n-1,如果ai>ai+1,则交换ai和ai+1的位置。
  2. 重复执行第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),算法的具体步骤如下:
  1. 如果n=0或者n=1,则对x的排序完成,计算结束。
  2. 如果n>1,则将向量(a1,...,an)分割成lower和upper两个子向量,其中lower包含x中所有小于a1的元素,upper包含x中所有大于a1的元素(等于a1的元素放在lower或upper中均可)。
  3. 对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语言实现的更多相关文章

  1. 第五篇:R语言数据可视化之散点图

    散点图简介 散点图通常是用来表述两个连续变量之间的关系,图中的每个点表示目标数据集中的每个样本. 同时散点图中常常还会拟合一些直线,以用来表示某些模型. 绘制基本散点图 本例选用如下测试数据集: 绘制 ...

  2. php四种基础算法:冒泡,选择,插入和快速排序法

    转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一 ...

  3. C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)

    算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...

  4. 冒泡,选择,插入,快速排序在Java中的实现

    近几天再重新看数据结构的书时,根据各种排序的空间复杂度,发现快速排序所用时间是最短的,也即是说快速排序的速度最快.因此想验证一下具体这几个排序发的快慢,所以在Java中得以实现,同时在运行时,发现虽然 ...

  5. php四种基础算法:冒泡,选择,插入和快速排序法PHP基础教程

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西.但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌 ...

  6. php 冒泡 快速 选择 插入算法 四种基本算法

    php四种基础算法:冒泡,选择,插入和快速排序法 来源:PHP100中文网 | 时间:2013-10-29 15:24:57 | 阅读数:120854 [导读] 许多人都说 算法是程序的核心,一个程序 ...

  7. python 数据结构与算法之排序(冒泡,选择,插入)

    目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...

  8. R语言统计分析技术研究 特征值选择技术要点

    特征值选择技术要点                          作者:王立敏 文章来源:  网络 1.特征值 特征值是线性代数中的一个重要概念.在数学,物理学,化学,计算机等领域有着广泛的应用. ...

  9. 几种经典排序算法的R语言描述

    1.数据准备 # 测试数组 vector = c(,,,,,,,,,,,,,,) vector ## [] 2.R语言内置排序函数 在R中和排序相关的函数主要有三个:sort(),rank(),ord ...

  10. R语言作为BI中ETL的工具

    R语言作为BI中ETL的工具,增删改 R语言提供了强大的R_package与各种数据库进行数据交互. 外加其强大数据变换清洗函数,为ETL提供一条方便快捷的道路. RODBC ROracal RMys ...

随机推荐

  1. fields设计与测试

     菲尔兹管理用例 一.向开发找到需求ID 需求设计文档ID 二.在fields的需求列表中,填入ID,创建计划 1.状态:测试接手 2.日期:冒烟日期,测试日期 3.可能遇到的问题: * 搜不到ID ...

  2. sentry-sdk 使用

    一.代码 import os import random import logging import sentry_sdk from sentry_sdk.tracing import Transac ...

  3. android 实现检测版本,下载apk更新(附源码)

    其实这不是什么难事了,都有热更新的技术了,只是记录一下,大神勿嘲笑. 先说下思路,首先要有更新的接口,只要进入app,就监测一下接口,是否更新,更新的话,检测本地版本是否低于接口返回的版本,低的话,就 ...

  4. disabled属性的简介和使用

    一.disabled属性的简介和使用 Html中的input元素.button元素.option元素等都具有一个disabled属性. disabled对a标签不起作用当赋予该属性时该元素将变得不可交 ...

  5. 上传图片到Mongo数据库;从Mongo数据库下载图片显示到前端

    /** * 上传一个图片文件,保存到mongo数据库中 * @param doc * @param parent 文件所在的目录 * @param request * @return */ @Post ...

  6. SAP HANA:XS Job

    5.SAP HANA XS Job XS Job:定义重复执行的后台定期任务: 例如定时执行数据更新到Table的操作,需要使用到XS Job; SAP HANA XS Setting up Sche ...

  7. gobuster安装

    Github地址:https://github.com/OJ/gobuste 第一种方式 sudo apt install golang-gogo install github.com/OJ/gobu ...

  8. foreach的异步(async,await)的问题及其处理方式

    开发中遇见个难题很苦恼,好在我解决了,只要能解决我就很开心 本篇文章从forEach方法 到promise 到async await统统理解个遍,进入正题 先看下面代码会出现什么问题: const a ...

  9. Hadoop2.7.3源码编译

    一.编译源码步骤演示详解 需求:官网下载的hadoop包,执行hadoop命令时,会有警告信息,为去除此警告,需要重新编译hadoop相应版本的源码,替换hadoop安装包lib目录下的native( ...

  10. java传递参数调用python完成剪切多个视频最终拼接成一个

    需求如题,综合考虑之后我选择python去做视频处理,最终结果也让我非常满意. 我是windows 环境,安装的python3.8和moviepy模块 第一步:安装python3.8 第二步:修改py ...