找到二个数组中第几大的数据。(答案讨论贴),如果想答题拿分的建议先去答题,再来看答案

fvflove 2008-10-03 09:39:28

'解题思路
'设置二个指针,分别指向 数组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%的奖励分哦.
...全文
189 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeah920 2008-10-07
  • 打赏
  • 举报
回复
帮忙顶一下,让了解的人来解答.

btw:他妈的,我还是CSDN论坛首页的常驻专家门诊(JAVA板块)呢,居然在JAVA板块既不能发新贴,也不能回复。
btw:郁闷,加的好友太多了,现在加好友都是非法请求了。连好友页面也打不开。连私信页面也打不开。
btw:CSDN当时没有测试过加好友很多的情况的吗?郁闷。现在一点加好友就出错。
东方之珠 2008-10-06
  • 打赏
  • 举报
回复
//看看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);
}
happy_sea 2008-10-06
  • 打赏
  • 举报
回复
这样气氛很好啊 :))
zzyong00 2008-10-06
  • 打赏
  • 举报
回复
c++都上了
zzyong00 2008-10-06
  • 打赏
  • 举报
回复
.....
lsftest 2008-10-06
  • 打赏
  • 举报
回复
楼主的两个初始数组都是有序的。
另外,知不知道两个数组里的元素的最大、最小值?
用户 昵称 2008-10-06
  • 打赏
  • 举报
回复
排序?
gguueesstt 2008-10-05
  • 打赏
  • 举报
回复
错了,写翻了


'笨方法,用 数组1的第1位 与 数组2 的第1位 进行比较,大数 所在数组 加1 ,继续比较,直到比较到所需要的第几大数
Dim arr_1
Dim arr_2

Private 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 Sub

Function 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

gguueesstt 2008-10-05
  • 打赏
  • 举报
回复
'笨方法,用 数组1的第1位 与 数组2 的第1位 进行比较,大数 所在数组 加1 ,继续比较,直到比较到所需要的第几大数
Dim arr_1
Dim arr_2

Private 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 Sub

Function 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

僵哥 2008-10-05
  • 打赏
  • 举报
回复
其实这也是一个排序的过程.只是根据数据性质(文本还是数据值,整数还是浮点数,数值的连续性等)的不同,数据量的大小(十万以内,十万到千万,千万以上),及可用资源来确实使用算法.
原始数据的顺序(完全随机顺序,正序,逆序)存在的概率也需要考虑到算法选择的条件当中.使用预测抽样有比较大的风险.除非能够在抽样之前做一次扫描,但是这个扫描的消耗也要算到复杂度当中.使用抽样最好的办法是使用可变样本,和多样本并行机制,从而使后面的搜索缩小范围.
happy_sea 2008-10-05
  • 打赏
  • 举报
回复
但愿帮顶有分。。。
熊孩子开学喽 2008-10-03
  • 打赏
  • 举报
回复
楼主的解法前提是两个数组都有序.
而且在前面的帖子中已经有人回答了将两个数组的前N位合并成一个新数组再冒泡的解决方法.
其实楼主上面说的方法依然是冒泡排序,只不过你没有合并数据,而直接在两个数组中直接比较了,并且用了"指针"的方法来代替了冒泡排序的交换数据而已.
还有一点就是,楼主根据原数组有序的情况,直接将冒泡比较的开始位置直接从N开始.

楼主之前的问题中还有个情况是乱序的.不知道楼主有什么其它方法解决.
lyserver 2008-10-03
  • 打赏
  • 举报
回复
我写了一个VB数组指针类,你可以上我的博客里看看,对你肯定有用。

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧