题目来自于《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. EF Core迁移 (provider: SSL Provider, error: 0 - 证书链是由不受信任的颁发机构颁发的。)

    A connection was successfully established with the server, but then an error occurred during the log ...

  2. Django views.py 增,删,改

    from django import forms from django.shortcuts import render, redirect from app01 import models # Cr ...

  3. [WinError 10061] 由于目标计算机积极拒绝,无法连接。- EnlightenGan运行

    在测试EnlightenGan时,可视化结果保存出现问题. 原因:调用visdom可视化,需要先打开visdom python -m visdom.server

  4. C - Functions again CodeForces - 789C (dp、思维)

    C - Functions again CodeForces - 789C #include<iostream> #include<cstdio> #include<cm ...

  5. 将pyinstaller打包的exe文件制作成安装包

    1. 下载安装 inno setup (下载地址:http://www.jrsoftware.org/isdl.php) 2. 配置inno setup中文语言包 inno setup默认并没有中文, ...

  6. springboot Elasticsearch 实体创建索引设置Date 类型字段失败

    springboot Elasticsearch 实体创建索引设置Date 类型字段失败,需添加以下注解 @Field(type = FieldType.Date, format = DateForm ...

  7. ElementUI Select下拉框定位问题!

    今天遇到了下拉不跟随文本框滚动的问题 参考官方手册添加参数: popper-append-to-body="false" 无效[内心很无语]继续检查向上推,查看html样式,发现了 ...

  8. P12证书转BKS证书

    安卓 识别的证书格式是bks ,而我之前生成的证书格式是p12 所以需要转换一下,至于怎么生成p12,请看我转载的的文章  Nginx https 双向认证. 1.请先下载第三方转换工具protecl ...

  9. 固定代码格式化程序插件-Prettier JetBrains

    基本使用 使用npm install prettier --save-dev为您的项目添加更漂亮或全局安装 使用Prettier选择要格式化的代码或文件 使用"Reformat with P ...

  10. 搭建Redis高可用集群的哨兵模式(Redis-Sentinel)【Windows环境】

    参考 https://blog.csdn.net/itanping/article/details/100544152 哨兵模式搭建好,Java中配置和使用Redis高可用集群的哨兵模式,引入Jedi ...