现在有二个数组:设定为:dim Arr_1 = Array(43,42,32,18,11,9,7,0,-1)dim Arr_1 = Array(38,37,31,25,22,5,-1)注意:上表是的数组是有序表。现在的问题是:如果最快的找到第6大的数据: 31要求:
1。算法的时间复杂度及空间复杂度必须最小。
2。即不建议用多重循环,也不建议再申请空间保存数组数据。
3。此题为讨论贴。
4。第一位给出合适算法的将得到50%的分,其它人员平均给分。

解决方案 »

  1.   

    就是这么回事,合并之后还是一个简单排序问题,合并可以用2次COPYMEMORY到一个新数组,时间消耗基本等于零
    如果采用的是冒泡排序,可以料想的优化方案:因为只需要的到第6大的数据,所以只需要进行6次相邻数据的两两比较和交换
    如果原数组未排序,无非就是新数组的长度从12变成原来2个数组长度只和而已,外层循环依然是6次
    要找到第N位,无非是把6用N来代替.说了半天,楼主不要告诉我你一点都不懂,或者从来没有自己思考过解决方案,那样我会很失望滴
      

  2.   

    很明显LZ在给大家送分~
    LX的加油
      

  3.   

    Private Sub Form_Load()
    Dim Arr_1()
    Dim Arr_2()
    Dim s
    Dim i, j, k As Integer
     Arr_1 = Array(43, 42, 32, 18, 11, 9, 7, 0, -1)
     Arr_2 = Array(38, 37, 31, 25, 22, 5, -1)
     Do While i < 6
     If Arr_1(0) > Arr_2(0) Then
      s = Arr_1(0)
     Arr_1(0) = Arr_1(k + 1)
     k = k + 1
    Else
    s = Arr_2(0)
    Arr_2(0) = Arr_2(j + 1)
    j = j + 1
    End If
    i = i + 1
    Loop
    MsgBox "第" & i & "个大数" & "=" & s
    End Sub
      

  4.   

    Private Sub Command1_Click()
        Dim Arr_1, Arr_2
        Dim i As Long, j As Long, k As Long
        Dim x As Long
        Arr_1 = Array(43, 42, 32, 18, 11, 9, 7, 0, -1)
        Arr_2 = Array(38, 37, 31, 25, 22, 5, -1)
        j = 0
        k = 0
        For i = 1 To 6
            If Arr_1(j) > Arr_2(k) Then
                x = Arr_1(j)
                j = j + 1
            Else
                x = Arr_2(k)
                k = k + 1
            End If
        Next
        Debug.Print x
    End Sub
    困了,没仔细推敲,不知道是不是有问题
      

  5.   

    楼上二位的代码,我没有进行验证,但是看了一下.
    空间复杂度可以说是最小的.时间复杂度也是只是循环了N(N大数)次.
    而且这种方法是我没有想到的.四楼说我没有想过,其实我也想过很多办法.但是大多数都是二个数组合并,排序.想取那一位就那一位.我相信这样的办法谁都会想到的.后来我想到了一个方法.(我是用C#写的,但是后来验证还是有点问题,大家有兴趣的话可以去C#.NET去翻一下)最多 循环次数为 N(N大数)等一会儿,我验证楼上二位的代码,再按我的思路写个VB的代码出来.