当前位置: 首页 > 编程笔记 >

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

董新觉
2023-03-14
本文向大家介绍Ruby实现插入排序算法及进阶的二路插入排序代码示例,包括了Ruby实现插入排序算法及进阶的二路插入排序代码示例的使用技巧和注意事项,需要的朋友参考一下

基础
将一个记录插入到一个已经排序好的表中,以得到一个记录增一的有序表。并且最关键的一点就是它把比当前元素大的记录都往后移动,用以空出“自己”该插入的位置。当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
 类似资料:
  • 本文向大家介绍ruby实现的插入排序和冒泡排序算法,包括了ruby实现的插入排序和冒泡排序算法的使用技巧和注意事项,需要的朋友参考一下 1、插入排序 2、冒泡排序

  • 本文向大家介绍Java实现直接插入排序和折半插入排序算法示例,包括了Java实现直接插入排序和折半插入排序算法示例的使用技巧和注意事项,需要的朋友参考一下 直接插入排序​ 1 排序思想: 将待排序的记录Ri插入到已经排好序的记录R1,R2,……,R(N-1)中。 对于一个随机序列而言,就是从第二个元素开始,依次将这个元素插入到它之前的元素中的相应位置。它之前的元素已经排好序。 第1次排序:将第2个

  • 本文向大家介绍Python实现快速排序和插入排序算法及自定义排序的示例,包括了Python实现快速排序和插入排序算法及自定义排序的示例的使用技巧和注意事项,需要的朋友参考一下 一、快速排序     快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所

  • 主要内容:插入排序算法的具体实现插入排序算法可以对指定序列完成升序(从小到大)或者降序(从大到小)排序,对应的时间复杂度为 。 插入排序算法的实现思路是:初始状态下,将待排序序列中的第一个元素看作是有序的子序列。从第二个元素开始,在不破坏子序列有序的前提下,将后续的每个元素插入到子序列中的适当位置。 举个简单的例子,用插入排序算法对 {14, 33, 27, 10, 35, 19, 42, 44} 实现升序排序的过程如下: 1)

  • 如果使用双向链表代替数组,是否有可能提高插入排序算法的运行时间? 非常感谢。

  • JavaScript算法-插入排序 插入排序 插入排序有两个循环,外循环将数组元素挨个移动,而内循环则对外循环中选中的元素及它后面的那个元素进行比较。如果外循环中选中的元素比内循环中选中的元素小,那幺数组会向右移动,为内循环中的这个元素腾出位置。 function insertionSort() { var temp,inner; for (var outer = 1; outer <=

  • 本文向大家介绍C++插入排序算法实例,包括了C++插入排序算法实例的使用技巧和注意事项,需要的朋友参考一下 插入排序 没事喜欢看看数据结构和算法,增加自己对数据结构和算法的认识,同时也增加自己的编程基本功。插入排序是排序中比较常见的一种,理解起来非常简单。现在比如有以下数据需要进行排序: 10 3 8 0 6 9 2 当使用插入排序进行升序排序时,排序的步骤是这样的: 10 3 8 0 6 9 2

  • 本文向大家介绍php实现插入排序,包括了php实现插入排序的使用技巧和注意事项,需要的朋友参考一下 以上就是本文所述的全部内容了,希望大家能够喜欢。