'解题思路
'设置二个指针,分别指向 数组A与数组B
'先设置A指针指向A的第N位。B指针指向B的第一位'以下是循环部分
'如果A指针指向的数据大于B指针指向的数据。则直接返回A指针指向的数据。'如果A指针指向的数据小于B指针指向的数据。则进行以下判断
'1.如果A指针指向的数据大于B指针指向的下一数据,则进行以下判断
  '1.1 A指针指向的上一数据小于B指针指向的数据,则直接返回A指针上一指向的数据。
  '1.2 A指针指向的上一数据大于B指针指向的数据,则直接返回B指针指向的数据。
'2.如果A指针指向的数据小于B指针指向的下一数据,则对指针进行移位。A指向上一位,B指向下一位'因此,最差的情况下是,A指向循环至最第一位。循环N次。
'最好的情况下是:不会循环,第一次就成功/'Arr_1 = Array(43, 42, 32, 18, 11, 9, 7, 0, -1)
'Arr_2 = Array(38, 37, 31, 15, 12, 5, -1)'取第六位的示例:'A指针指向数据 9  B指针指向数据 38
'9<38 进行判断 9<37
'A指向11 B指向 37
'11<37 进行判断 11<31
'A指向 18  B指向 31
'18<31 进行判断 18>15(子判断 33>31)返回31
'一共进行了二次循环
'不知我以上的解题思路是否有问题?
'欢迎大家讨论完善.'如果大家另取方法,比我的这个方法的时间及空间复杂度更小的话.在此贴中又可获得50%的奖励分哦.

解决方案 »

  1.   

    '笨方法,用 数组1的第1位 与 数组2 的第1位 进行比较,大数 所在数组 加1 ,继续比较,直到比较到所需要的第几大数
    Dim arr_1
    Dim arr_2Private Sub Form_Load()
        arr_1 = Array(43, 42, 32, 18, 11, 9, 7, 0, -1)
        arr_2 = Array(38, 37, 31, 15, 12, 5, 1)
        GetNo 15
    End SubFunction GetNo(ByVal tNo As Long)
        Dim m As Long   '记录数组1 正在运算 的位置
        Dim n As Long   '记录数组1 正在运算 的位置
        Dim ret As Long '需要的第几大数
        Dim l As Long   '记录最后结果
        Do
            ret = ret + 1
            If arr_1(m) > arr_2(n) Then
                l = arr_1(m)
                If UBound(arr_1) < m Then m = m + 1 '防止数组出头
            Else
                l = arr_2(n)
                If UBound(arr_2) < n Then n = n + 1 '防止数组出头
            End If
        Loop Until ret = tNo
        Debug.Print l
    End Function
      

  2.   

    错了,写翻了
    '笨方法,用 数组1的第1位 与 数组2 的第1位 进行比较,大数 所在数组 加1 ,继续比较,直到比较到所需要的第几大数
    Dim arr_1
    Dim arr_2Private Sub Form_Load()
        arr_1 = Array(43, 42, 32, 18, 11, 9, 7, 0, -1)
        arr_2 = Array(38, 37, 31, 15, 12, 5, 1)
        GetNo 15
    End SubFunction GetNo(ByVal tNo As Long)
        Dim m As Long   '记录数组1 正在运算 的位置
        Dim n As Long   '记录数组1 正在运算 的位置
        Dim ret As Long '需要的第几大数
        Dim l As Long   '记录最后结果
        Do
            ret = ret + 1
            If arr_1(m) > arr_2(n) Then
                l = arr_1(m)
                If m < UBound(arr_1) Then m = m + 1 '防止数组出头  ’刚才写翻了
            Else
                l = arr_2(n)
                If n < UBound(arr_2) Then n = n + 1 '防止数组出头
            End If
        Loop Until ret = tNo
        Debug.Print l
    End Function
      

  3.   

    //看看C++的快速排序,非常快.我还是喜欢C的排序算法
    ////////////////////////生成10个随机数,显示在10个编辑框中//////////////void CEeeDlg::OnButton2()   
    {
    srand((unsigned)time(NULL)); 
    for(int i=0;i<10;i++)
    {
    CString str;
    str.Format("%d",rand());
    GetDlgItem(IDC_EDIT16+i)->SetWindowText(str);
    }
    }
      
    //////////////调用快速排序函数,对前10 个编辑框中的数字进行排序//////////////////void CEeeDlg::OnSort()   
    { int x[10]; for(int i=0;i<10;i++)
    {

    CString s;
    GetDlgItem(IDC_EDIT16+i)->GetWindowText(s);
    x[i+1]=atoi(s);
    }
     
    quick_sort(x,1,10); for(i=0;i<10;i++)
    {
    CString str;
    str.Format("%d",x[i+1]);
    GetDlgItem(IDC_EDIT26+i)->SetWindowText(str);
    }
    }
    /////////////////////////////////////快速排序函数的实现过程/////////////////void CEeeDlg::quick_sort(int x[], int low, int high)   
    {
    int i=low, j=high;
    int t=x[low];   
      while (i<j)
      {
       while (i<j && x[j]>t)  
       j--;
      
    x[i]=x[j];
       while (i<j && x[i]<=t) 
      i++;  
     
    x[j]=x[i];     x[i] = t;
     
      quick_sort(x,low,i-1); //递归调用此函数  
      quick_sort(x,i+1,high);
      }

    //////////////清空所有编辑框中的数字/////////////////////////////
    void CEeeDlg::OnClear() 
    {
    for(int i=0;i<10;i++)
    {

    GetDlgItem(IDC_EDIT16+i)->SetWindowText("");
    GetDlgItem(IDC_EDIT16+i)->SetWindowText(""); }
    }void CEeeDlg::OnAbout() 
    { CAboutDlg dlg;
    dlg.DoModal();
    }
    ///////////////////改变控件的颜色//////////////////////HBRUSH CEeeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    for(int i=0; i<10;i++)
    {
    if(pWnd->GetDlgCtrlID()==IDC_EDIT16+i)
    pDC->SetTextColor(RGB(0,0,255)); if(pWnd->GetDlgCtrlID()==IDC_EDIT26+i)
    pDC->SetTextColor(RGB(0,128,128)); if(pWnd->GetDlgCtrlID()==IDC_TIME)
    pDC->SetTextColor(RGB(0,0,255));
    }

    return hbr;
    }
    ////////////////////显示时间///////////////////////////void CEeeDlg::OnTimer(UINT nIDEvent) 
    { GetDlgItem(IDC_TIME)->SetFont(&m_font);
    CTime t=CTime::GetCurrentTime();
    m_time=t.Format("%H:%M:%S");
    UpdateData(false); CDialog::OnTimer(nIDEvent);
    }
      

  4.   

    帮忙顶一下,让了解的人来解答.btw:他妈的,我还是CSDN论坛首页的常驻专家门诊(JAVA板块)呢,居然在JAVA板块既不能发新贴,也不能回复。
    btw:郁闷,加的好友太多了,现在加好友都是非法请求了。连好友页面也打不开。连私信页面也打不开。
    btw:CSDN当时没有测试过加好友很多的情况的吗?郁闷。现在一点加好友就出错。