新闻动态

Ruby实现插入排序算法及进阶的二路插入排序代码示例

发布日期:2022-01-08 08:19 | 文章来源:gibhub

基础
将一个记录插入到一个已经排序好的表中,以得到一个记录增一的有序表。并且最关键的一点就是它把比当前元素大的记录都往后移动,用以空出“自己”该插入的位置。当n-1趟插入完成后该记录就是有序序列。

def insertSort(tarray)
  i=1
  while(i < tarray.size) do
if tarray[i] < tarray[i-1]
  j=i-1
  x=tarray[i]
#puts x.class
#puts tarray[i].class
  tarray[i]=tarray[i-1]#先与左侧第一个比自己大的交换位置
  while(x< tarray[j].to_i) do#寻找到一个比自己小的,并放在其后
tarray[j+1]=tarray[j]
#puts tarray[j].class
j=j-1
  end
  tarray[j+1]=x
end
i=i+1
  end
 end
a=[5,2,6,4,7,9,8]
insertSort(a)
print a
[2, 4, 5, 6, 7, 8, 9]>Exit code: 0

刚开始写代码时,在x< tarray[j]处没有加to_i方法,出现了如下错误:

final.rb:10:in `<': comparison of Fixnum with nil failed (ArgumentError)

一开始我很困惑,便在输出了x.class,tarray[j].class,然而这两的输出都是Fixnum。后来发现,Ruby的Array类和其他的不太一样,Ruby中允许一个Array对象中存储不同类型的元素,当a的一个元素赋值给x后,无法确定与x比较的a[i]是否是Fixnum类型,所以报错,这只是我自己的理解。

进阶
2路插入排序基于折半插入排序:

def two_way_sort data
 first,final = 0,0
 temp = []
 temp[0] = data[0]
 result = []
 len = data.length
 for i in 1..(len-1)
  if data[i]>=temp[final]
final +=1
temp[final] = data[i]
  elsif data[i]<= temp[first]
first = (first -1 + len)%len
temp[first] = data[i]
  else
if data[i]<temp[0]
 low = first
 high = len -1

 while low <=high do
  m = (low + high)>>1
  if data[i]>temp[m]
low = m + 1
  else
high = m -1
  end
 end
 
 j = first - 1
 first -=1
 while j < high do
  temp[j] = temp[j+1]
  j +=1
 end
 
 temp[high] = data[i]
else
 low =0
 high = final
 while low <=high do
  m =(low + high)>>1
  if data[i]>=temp[m]
low = m + 1
  else
high = m - 1
  end
 end
 j = final + 1
 final +=1
 while j > low do
  temp[j] = temp[j-1]
  j -=1
 end 
 temp[low] = data[i]
end
  end 
  p temp 
 end
 i = 0
 for j in first..(len - 1)
  result[i] = temp[j]
  i +=1
 end
 for j in 0..final
  result[i] = temp[j]
  i +=1
 end
 return result
end

data = [4,1,5,6,7,2,9,3,8].shuffle
p data
result = two_way_sort data
p result

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部