Ruby实现的3种快速排序算法

   这篇文章主要介绍了Ruby实现的3种快速排序算法,本文给出了快速排序的普通版本、快速排序的随机化版本、快速排序的利用了Ruby的语法糖的随机化版本三个版本,需要的朋友可以参考下

  刚学Ruby,正巧算法老师鼓励用不熟悉的语言来写算法,我就用Ruby吧~~

  话说Ruby可真是超厉害,好多凭直觉的方法都可以用。。。。。无限膜拜中。。。。

  期间我遇到了invalid multibyte char (US-ASCII)的错误,解决办法是在开头加一个#encoding:utf-8

  这个错误在stackoverflow上有人问到过,某人给出的回答是

  Write # encoding: utf-8 on top of that file. That changes the default encoding of all string/regexp literals in that file utf-8.

  参考链接:http://stackoverflow.com/questions/3678172/ruby-1-9-invalid-multibyte-char-us-ascii

  快速排序的普通版本:

   代码如下:

  #encoding: utf-8

  #author: xu jin, 4100213

  #date: Oct 20, 2012

  #RandomizedQuickSort

  #to sort an array by using QuickSort

  #example:

  #The original array is:[10, 35, 25, 67, 69, 52, 24, 40, 69, 76, 6, 49]

  #The sorted array is: [6, 10, 24, 25, 35, 40, 49, 52, 67, 69, 69, 76]

  arrayInt = Array.new

  index = 0

  while (index < 12)

  arrayInt[index] = rand(100) #produce 12 random number

  index += 1

  end

  puts "The original array is:" + arrayInt.to_s

  def QuickSort(arrayInt, first, last)

  if first < last

  middle = Partition(arrayInt, first, last)

  QuickSort(arrayInt, first, middle - 1)

  QuickSort(arrayInt, middle + 1, last)

  end

  end

  def Partition(arrayInt, first, last)

  x = arrayInt[last]

  i = first - 1

  for j in first .. (last - 1)

  if arrayInt[j] <= x

  i += 1

  arrayInt[i], arrayInt[j] = arrayInt[j], arrayInt[i] #exchange

  end

  end

  arrayInt[i + 1], arrayInt[last] = arrayInt[last], arrayInt[i + 1]

  return i + 1

  end

  QuickSort(arrayInt, 0, arrayInt.length-1)

  puts "The sorted array is: " + arrayInt.to_s

  快速排序的随机化版本:

  代码如下:

  #encoding: utf-8

  #author: xu jin, 4100213

  #date: Oct 20, 2012

  #RandomizedQuickSort

  #to sort an array by using randomized QuickSort

  #example:

  #The original array is:[14, 47, 46, 49, 82, 76, 92, 22, 44, 81, 59, 61]

  #The sorted array is: [14, 22, 44, 46, 47, 49, 59, 61, 76, 81, 82, 92]

  arrayInt = Array.new

  index = 0

  while (index < 12)

  arrayInt[index] = rand(100) #produce 12 random number

  index += 1

  end

  puts "The original array is:" + arrayInt.to_s

  def RandomizedQuickSort(arrayInt, first, last)

  if first < last

  middle = RandomizedPartition(arrayInt, first, last)

  RandomizedQuickSort(arrayInt, first, middle - 1)

  RandomizedQuickSort(arrayInt, middle + 1, last)

  end

  end

  def RandomizedPartition(arrayInt, first, last)

  i = rand(last - first + 1) + first

  arrayInt[i], arrayInt[last] = arrayInt[last], arrayInt[i]

  return Partition(arrayInt, first, last)

  end

  def Partition(arrayInt, first, last)

  x = arrayInt[last]

  i = first - 1

  for j in first .. (last - 1)

  if arrayInt[j] <= x

  i += 1

  arrayInt[i], arrayInt[j] = arrayInt[j], arrayInt[i] #exchange

  end

  end

  arrayInt[i + 1], arrayInt[last] = arrayInt[last], arrayInt[i + 1]

  return i + 1

  end

  RandomizedQuickSort(arrayInt, 0, arrayInt.length-1)

  puts "The sorted array is: " + arrayInt.to_s

  快速排序的利用了Ruby的语法糖的随机化版本:

  代码如下:

  #encoding: utf-8

  #author: xu jin, 4100213

  #date: Oct 20, 2012

  #RandomizedQuickSort

  #to sort an array by using randomized QuickSort

  #example:

  #The original array is:[14, 47, 46, 49, 82, 76, 92, 22, 44, 81, 59, 61]

  #The sorted array is: [14, 22, 44, 46, 47, 49, 59, 61, 76, 81, 82, 92]

  arrayInt = Array.new

  index = 0

  while (index < 12)

  arrayInt[index] = rand(100) #produce 12 random number

  index += 1

  end

  puts "The original array is:" + arrayInt.to_s

  def RandomizedQuickSort(a)

  i = rand(a.length)

  a[i], a[a.length - 1] = a[a.length - 1], a[i]

  (x=a.pop) ? RandomizedQuickSort(a.select{|i| i <= x}) + [x] + RandomizedQuickSort(a.select{|i| i > x}) : []

  end

  puts "The sorted array is: " + RandomizedQuickSort(arrayInt).to_s

时间: 2024-09-11 15:55:52

Ruby实现的3种快速排序算法的相关文章

PHP两种快速排序算法实例

 这篇文章主要介绍了PHP两种快速排序算法实例,本文直接给出实现代码,分别使用递归法.迭代法实现,需要的朋友可以参考下     虽然在PHP这样的web应用开发中,我们不是太强调排序的重要性,因为PHP自身已经带了例如sort()等这样强大的排序函数,但是在一些重要的场合,例如某些高并发的场合,我想排序算法的影响已经不能忽略.所以在此介绍递归排序和迭代排序. 递归法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 /** *

快速排序算法在Swift编程中的几种代码实现示例_Swift

总所周知 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用. 基本原理是: 数组a = [1,3,5,7,6,4,2] 1 选定一个 基准 a[0] 2 把比 a[0]小的放左边,比a[0]大的放右边. 中断递归如果少于两个数字 则不执行. 3 然后再分别对两边 执行 1,2,3操作. 对快速排序 的 想法 1 在待排序元素 大部分是有序的情况下, 速度 非常很快. 2 在最差的情况下,速度就很慢了. 相当于冒泡了 3 所以 快排的 优化, 定基准 非常重要,

采用部分快速排序算法实现数组的部分排序

快速排序算法,网上相关文章已经介绍的很多了,数据结构教材中也有很详 细的介绍.本文需要阐述的不是全排序快速排序算法,而是部分快速排序算法. 所谓部分快速排序算法是指通过排序获取一个数列中最大的若干条有序记录.比如我们需要从一个有1百万记录的数组中获取前100条有序记录,并按从大到小顺 序显示给用户,这种应用在搜索引擎中经常被使用,很少会有人有耐心将100万 条搜索出来的记录都阅读一遍,一般阅读前几百条纪录就可以得到自己满意的答案.其实这种算法很像SQLSERVER 中的TOP n 的实现,不过数

经典的7种排序算法 原理C++实现

经典的7种排序算法 原理C++实现 排序是编程过程中经常遇到的操作,它在很大程度上影响了程序的执行效率. 7种常见的排序算法大致可以分为两类:第一类是低级排序算法,有选择排序.冒泡排序.插入排序:第二类是高级排序算法,有堆排序.排序树.归并排序.快速排序. 一.低级排序算法 1. 选择排序 排序过程:给定一个数值集合,循环遍历集合,每次遍历从集合中选择出最小或最大的放入集合的开头或结尾的位置,下次循环从剩余的元素集合中遍历找出最小的并如上操作,最后直至所有原集合元素都遍历完毕,排序结束. 实现代

java语言中哪一种排序算法用的最多?

问题描述 java语言中哪一种排序算法用的最多? java语言中哪一种排序算法用的最多?快速排序既然效率高,为什么我们还要用冒泡呢?冒泡的好处是什么? 解决方案 不能说快速排序一定效率高,对于有序的序列,归并排序的效率就更高.对于大量小整数的排序,基数排序不但效率高,而且占用内存少.各种排序有不同的使用场合.所以都要学习,而不是问哪种常用. 解决方案二: 冒泡排序是用来理解排序的思路的,快速排序是默认的java排序,但是稳定性极差,建议你去百度八大排序,从快速插入排序开始,系统的学习理解排序.

逐步讲解快速排序算法及C#版的实现示例_C#教程

算法思想快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). 该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤.因此我的对快速排序作了进一步的说明:挖坑填数+分治法: 先

JavaScript中几种排序算法的简单实现_基础知识

排序算法的实现 我的JS水平就是渣渣,所以我就用类似于JAVA和C的方式来写JavaScript的排序算法了. 而且这里我不讲算法原理,仅仅只是代码实现,可能会有Bug,欢迎大家博客评论指导.插入排序 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排

php四种基础算法代码实例_php实例

php四种基础算法:冒泡,选择,插入和快速排序法许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的.下面是我按自己的理解,将四个方法分析一遍.需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序. $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法

Go语言展现快速排序算法全过程的思路及代码示例_Golang

快速排序算法快速排序是一个递归的思想,首先选择一个数作为基数,把数组中小于它的数放在它的左边,把大于它的数放在它的右边,然后对左右两边的数递归进行排序. 算法的关键部分是实现数组的划分,即怎么把数组的元素划分成两部分,使得左边的数比基数小,右边的数比基数大.划分有许多不同的实现方法,这里主要使用单向扫描的方法,后面再稍微介绍双向扫描的方法. 选择最右边的数字作为基数.使用一个变量j记录当前左边数字(比基数小的数)的最右的下标值.然后使用变量i从左到右遍历数组,如果a[i]比基数小,说明a[i]属