'解题思路
'设置二个指针,分别指向 数组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%的奖励分哦.
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
'笨方法,用 数组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
////////////////////////生成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);
}
btw:郁闷,加的好友太多了,现在加好友都是非法请求了。连好友页面也打不开。连私信页面也打不开。
btw:CSDN当时没有测试过加好友很多的情况的吗?郁闷。现在一点加好友就出错。