几种经典排序算法的R语言描述
1.数据准备
- # 测试数组
- vector = c(,,,,,,,,,,,,,,)
- vector
- ## []
2.R语言内置排序函数
在R中和排序相关的函数主要有三个:sort(),rank(),order()。
- sort(x)是对向量x进行排序,返回值排序后的数值向量;
- rank()是求秩的函数,它的返回值是这个向量中对应元素的“排名”;
- order()的返回值是对应“排名”的元素所在向量中的位置。
- sort(vector)
- ## []
- order(vector)
- ## []
- rank(vector)
- ## []
3.冒泡排序
冒泡排序是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
- # bubble sort
- bubbleSort = function(vector) {
- n = length(vector)
- :(n-)) {
- ):n) {
- if(vector[i]>=vector[j]){
- temp = vector[i]
- vector[i] = vector[j]
- vector[j] = temp
- }
- }
- }
- return(vector)
- }
- bubbleSort(vector)
- ## []
4.快速排序
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
- # quick sort
- quickSort = function(vector, small, big) {
- left = small
- right = big
- if (left >= right) {
- return(vector)
- }else{
- markValue = vector[left]
- while (left < right) {
- while (left < right && vector[right] >= markValue) {
- right = right -
- }
- vector[left] = vector[right]
- while (left < right && vector[left] <= markValue) {
- left = left +
- }
- vector[right] = vector[left]
- }
- vector[left] = markValue
- vector = quickSort(vector, small, left - )
- vector = quickSort(vector, right + , big)
- return(vector)
- }
- }
- quickSort(vector,,)
- ## []
5 插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
- # insert sort
- insertSort = function(vector){
- n = length(vector)
- :n){
- markValue = vector[i]
- j=i-
- ){
- if(vector[j]>markValue){
- vector[j+] = vector[j]
- vector[j] = markValue
- }
- j=j-
- }
- }
- return(vector)
- }
- insertSort(vector)
- ## []
6.希尔排序
希尔排序是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
- # shell sort
- shellSort = function(vector){
- n = length(vector)
- separate = floor(n/)
- ){
- :separate){
- j = i+separate
- while(j<=n){
- m= j- separate
- markVlaue = vector[j]
- ){
- if(vector[m]>markVlaue){
- vector[m+separate] = vector[m]
- vector[m] = markVlaue
- }
- m = m-separate
- }
- j = j+separate
- }
- }
- separate = floor(separate/)
- }
- return(vector)
- }
- shellSort(vector)
- ## []
7.选择排序
选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法.
- # select sort
- selectSort = function(vector){
- n = length(vector)
- :(n-)){
- minIndex = i
- ):n){
- if(vector[minIndex]>vector[j]){
- minIndex = j
- }
- }
- temp = vector[i]
- vector[i] = vector[minIndex]
- vector[minIndex] = temp
- }
- return(vector)
- }
- selectSort(vector)
- ## []
8.堆排序
堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
- # heap sort
- adjustHeap = function(vector,k,n){
- left = *k
- right = *k+
- max = k
- ){
- if(left<=n&&vector[left]>=vector[max]){
- max = left
- }
- if(right<=n&&vector[right]>=vector[max]){
- max = right
- }
- if(max!=k){
- temp = vector[k]
- vector[k] = vector[max]
- vector[max] = temp
- vector = adjustHeap(vector,max,n)
- }
- }
- return(vector)
- }
- createHeap = function(vector,n){
- ):){
- vector = adjustHeap(vector,i,n)
- }
- return(vector)
- }
- heapSort = function(vector){
- n = length(vector)
- vector = createHeap(vector,n)
- :n){
- temp = vector[n-i+]
- vector[n-i+] = vector[]
- vector[] = temp
- vector = adjustHeap(vector,,n-i)
- }
- return(vector)
- }
9.归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。
- # merge sort
- combine = function(leftSet,rightSet){
- m =
- n =
- vectorTemp = c()
- while (m<=length(leftSet)&&n<=length(rightSet)) {
- if(leftSet[m]<=rightSet[n]){
- vectorTemp = append(vectorTemp,leftSet[m])
- m = m+
- }else{
- vectorTemp = append(vectorTemp,rightSet[n])
- n = n+
- }
- }
- if(m>length(leftSet)&&n==length(rightSet)){
- vectorTemp = append(vectorTemp,rightSet[n:length(rightSet)])
- }else if(m==length(leftSet)&&n>length(rightSet)){
- vectorTemp = append(vectorTemp,leftSet[m:length(leftSet)])
- }
- return(vectorTemp)
- }
- mergeSort = function(vector){
- size = length(vector)
- ){
- return(vector)
- }
- cut = ceiling(size/)
- leftSet = mergeSort(vector[:cut])
- rightSet = mergeSort(vector[(cut+):size])
- vector = combine(leftSet,rightSet)
- return(vector)
- }
//
//
几种经典排序算法的R语言描述的更多相关文章
- 常用七大经典排序算法总结(C语言描述)
简介 其中排序算法总结如下: 一.交换排序 交换排序的基本思想都为通过比较两个数的大小,当满足某些条件时对它进行交换从而达到排序的目的. 1.冒泡排序 基本思想:比较相邻的两个数,如果前者比后者大,则 ...
- 【最全】经典排序算法(C语言)
算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ...
- 七种经典排序算法及Java实现
排序算法稳定性表示两个值相同的元素在排序前后是否有位置变化.如果前后位置变化,则排序算法是不稳定的,否则是稳定的.稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功. 下 ...
- Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现
2017年4月29日~5月1日,国际劳动节, 三天的小长假. 在国内,小长假往往是这样的: 然而我当时在戏称为"德村"(德国农村)的Walldorf出差并且住在Wiesloch, ...
- 基于python的七种经典排序算法
参考书目:<大话数据结构> 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. ...
- 基于python的七种经典排序算法(转)
一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性:经过某种排序后,如果两个 ...
- 【转载】常见十大经典排序算法及C语言实现【附动图图解】
原文链接:https://www.cnblogs.com/onepixel/p/7674659.html 注意: 原文中的算法实现都是基于JS,本文全部修改为C实现,并且统一排序接口,另外增加了一些描 ...
- 十大经典排序算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...
- 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述
关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...
随机推荐
- python基础3(元祖、字典、深浅copy、集合、文件处理)
本次内容: 元祖 字典 浅copy和深copy 集合 文件处理 1.1元祖 元祖(tuple)与列表类似,不同之处在于元祖的元素不能修改,元祖使用小括号(),列表使用方括号[].元祖创建很简单,只需要 ...
- 使用XAMPP创建本地浏览器经验
1.曾经装过XAMPP,再次安装时需要检查以前的所有痕迹是否清除干净,否则,会导致出现很多问题. 2.第一次安装XAMPP端口一般来说,并不需要修改.当然需要修改的时候在Config按钮中修改.总共有 ...
- 漫谈JVM
背景介绍 JVM已经是Java开发的必备技能了,JVM相当于Java的操作系统. JVM,java virtual machine, 即Java虚拟机,是运行java class文件的程序. Java ...
- .NET简谈事务、分布式事务处理
http://www.cnblogs.com/wangiqngpei557/archive/2011/12/22/2298500.html
- UICollectionView
#import "ViewController.h" @interfaceViewController ()<UICollectionViewDataSource,UICol ...
- margin双边距的问题
margin:20px;height:20px;float:left margin:20px;height:20px;float:left
- thwen 缓动框架
描述 目前提供一个方法 ele 元素对象 obj 操作 duration 时间 effect 缓动选择 thwenMove(option) 框架支持以下缓动策略 -指数衰减的正弦曲线缓动 -圆形曲线的 ...
- php5 数据类型
一.PHP主要有一下几种数据类型 String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值) ...
- SQL 的坑1 除法“”不可用“”
今天工作中遇见 一问题,有5各部分,现要求5个部分各自的比例,SQL语句没有问题,后来还试了"加","减","乘","Round& ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...