问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

编程实现在一维数组中的折半查找算法。以上可采用任何编程语言实现.

发布网友 发布时间:2022-11-30 03:33

我来回答

5个回答

热心网友 时间:2023-10-30 08:37

折半查找是在排好序的数组中可采用的一种非常快的查找方法。它的工作原理如下:

将要查找的数据项与数组的中间元素相比较。
如果它们相同,那么查找成功。
如果查找的数据项小于数组的中间元素,那么就放弃数组的后半部分。
如果查找的数据项大于数组的中间元素,那么就放弃数组的前半部分。
重复步骤1~4,将数组不断减半,直至找到查找的数据项或者查找完整个数组为止。
从下面的程序清单可以看出,折半查找算法在实际应用中几乎不受数组大小的影响,即使数组的长度增加一倍,也只是在程序中多了一次循环而已。

'
' Description: Mole containing various binary search routines
'
' Authors: Stephen Bullen, www.oaltd.co.uk
' Rob Bovey, www.appspro.com
'

Option Explicit
Option Private Mole

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Comments: Uses a binary search algorithm to quickly locate a string
' within a sorted array of strings
'
' Arguments: sLookFor The string to search for in the array
' auArray An array of strings, sorted in ascending order
' lCompareMethod Either vbBinaryCompare or vbTextCompare. Defaults to vbTextCompare
' lNotFound The value to return if the text isn't found. Defaults to -1
'
' Returns: Long The located position in the array, or -1 if not found
'
' Date Developer Action
' --------------------------------------------------------------
' 02 Jun 04 Stephen Bullen Created
'
Function BinarySearchString(ByRef sLookFor As String, ByRef asArray() As String, _
Optional ByVal lCompareMethod As VbCompareMethod = vbTextCompare, _
Optional ByVal lNotFound As Long = -1) As Long

Dim lLow As Long, lMid As Long, lHigh As Long
Dim iComp As Integer

On Error GoTo PTR_Exit

'Assume we didn't find it
BinarySearchString = lNotFound

'Get the starting positions
lLow = LBound(asArray)
lHigh = UBound(asArray)

Do
'Find the midpoint of the array
lMid = (lLow + lHigh) \ 2

'Compare the mid-point element to the string being searched for
iComp = StrComp(asArray(lMid), sLookFor, lCompareMethod)

If iComp = 0 Then
'We found it, so return the location and quit
BinarySearchString = lMid
Exit Do

ElseIf iComp = 1 Then
'The midpoint item is bigger than us - throw away the top half
lHigh = lMid - 1
Else
'The midpoint item is smaller than us - throw away the bottom half
lLow = lMid + 1
End If

'Continue until our pointers cross
Loop Until lLow > lHigh

PTR_Exit:

End Function

'********************************************************************
'* Function Name: BinarySearchVariant
'*
'* Inputs: vLookFor - The value to search for in the array
'* vaArray - A Variant array, sorted in ascending order
'* lNotFound - The value to return if the text isn't found
'* Defaults to -1
'*
'* Outputs: The located position in the array, or -1 if not found
'*
'* Purpose: Uses a binary search algorithm to quickly locate a string
'* within a sorted array of strings
'*
'********************************************************************
Function BinarySearchVariant(ByVal vLookFor As Variant, ByRef vaArray As Variant, _
Optional ByVal lNotFound As Long = -1) As Long

Dim lLow As Long, lMid As Long, lHigh As Long

On Error GoTo PTR_Exit

'Assume we didn't find it
BinarySearchVariant = lNotFound

'Get the starting positions
lLow = LBound(vaArray)
lHigh = UBound(vaArray)

Do
'Find the midpoint of the array
lMid = (lLow + lHigh) \ 2

If vaArray(lMid) = vLookFor Then
'We found it, so return the location and quit
BinarySearchVariant = lMid
Exit Do

ElseIf vaArray(lMid) > vLookFor Then
'The midpoint item is bigger than us - throw away the top half
lHigh = lMid - 1
Else
'The midpoint item is smaller than us - throw away the bottom half
lLow = lMid + 1
End If

'Continue until our pointers cross
Loop Until lLow > lHigh

PTR_Exit:

End Function

参考资料:http://www.myfootprints.cn/blog/post/74.html

热心网友 时间:2023-10-30 08:37

/***
* 文件名称:test_halfind.c
* 摘 要:折半查找法
* 作 者:E_rainboy
* 完成时间:2009年3月29日
*
*/
#include <stdio.h>
#include <assert.h>

#define LEN 8

int a[LEN] = { 1, 3, 3, 3, 4, 5, 6, 7 };

int is_sorted()
{
int i, sorted = 1;
/*判定数组是否是有序的*/
for (i = 1; i < LEN; i++)
sorted = sorted && a[i-1] <= a[i];
return sorted;
}

int mustbe(int start, int end, int number)
{
int i;

for (i = 0; i < LEN; i++) {
/*确定数组合法,并且起始标志正确*/
if (i >= start && i <= end) {
continue;
/*确定该数字存在于数组中*/
if (a[i] == number) {
return 0;
}else {
printf("要查找的数字不再数组中!");
}
}
}
return 1;
}

int binarysearch(int number)
{
/*对起始点中点和终点进行标记*/
int mid = 0;
int start = 0;
int end = LEN - 1;
/*数组校验*/
assert(is_sorted());
while (start <= end) {
/*起始终点标志校验以及要查找的数字存在校验*/
assert(mustbe(start, end, number));
/*中点选择*/
mid = (start + end) / 2;
if (a[mid] < number) {
start = mid + 1;
}else if (a[mid] > number) {
end = mid - 1;
}else {
return mid;
}
}
/*起始终点标志校验以及要查找的数字存在校验*/
assert(mustbe(start, end, number));
return -1;
}

int main(void)
{
int i_number = 0;
printf("请输入您要查找的数字:");
scanf("%d", &i_number);
printf("您要查找的数字%d在数组中!\n", binarysearch(i_number));
return 0;
}
此程序已经在unix环境下用vi调试通过了,在windows环境下用VC6.0调试通过。
一维数组(折半的前提是数组元素已经有序排列)可以自己更改!

热心网友 时间:2023-10-30 08:38

给你个C++的
------------------------------------------------------------
int binarySearch(int list[],int key,int arraySize){
int low = 0;
int high = arraySize - 1;
while(high >= low)
{
int mid = (low+high)/2;
if(key < list[mid]) high = mid - 1;
else if (key == list[mid]) return mid;
else low = mid + 1;
}
return -low - 1;
}

热心网友 时间:2023-10-30 08:39

// pascal

var
a:array[1..maxnum] of integer;
N_find,i,j,mid:integer;
judge:boolean;

begin
readln(N_find);
i:=1;
j:=n;
judge:=false;
while not judge do
begin
mid:=(i+j) div 2;
if a[mid]=N_find then
begin
writeln('location: ',mid,);
judge:=true;
end;
if N_found>a[mid]
then i:=mid+1
else j:=mid-1;
end;
if not judge then writeln('NO data');
end.

热心网友 时间:2023-10-30 08:39

+++++编程实现在一维数组中的折半查找算法。以上可采用任何编程语言实现.
悬赏分:200 - 离问题结束还有 19 天 22 小时
编程实现在一维数组中的折半查找算法
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
美的面包机和面要多久 美的面包机和面的时间要多长 美的面包机怎么用手动操作 如何用美的面包机发面 如何用美的面包机和面 美的面包机如何和面 CDR教程—教你如何使用CorelDRAW复制图形方法 苹果手机微信怎么换漂亮字体(苹果手机微信怎么换行输入) 有什么好用的app转换字体 手写转文字的软件 erp可以看评论地址吗 淘宝评论url是什么意思? 和老公蜜月旅行选择了去厦门海边,,有谁知道哪家旅馆不错啊? 知道手机号连在电脑上能找回删除的照片吗? 有对方手机号,能否搜索到对方照片? 妈妈今天生日,相送康乃馨,不知道送多少朵合适,什么颜色的 有什么含义 给妈妈买什么颜色的康乃馨最好. wps2019快速访问工具栏中不包含 送给妈妈康乃馨什么花合适? 怀孕37周,如果胎儿偏小,体重还能补上来吗 知识产权评估情形 高考结束送什么花合适 垡头这一块有九年一贯制的小学吗 盘点属马的富豪有哪些? 仁寿县文林街道海味轩生蚝餐饮店怎么样 集思广益的意思是什么 集思广益造句 近义词反义词 京东自营拉菲红酒正宗吗 京东卖的新西兰白葡萄酒是正品么 西宁七中跟岗研修学习考察报告(2) 十一去丽江穿什么 请问歼-11B重型战斗机是否已经换装了有源相控阵雷达? 是不是和10b的同一档次 十一月去丽江穿什么 ev1格式转换成mp4 宝爸宝妈们高情商教育孩子,能培养孩子学会哪些事呢? 爸爸去哪儿5五位爸爸片酬曝光 爸爸去哪儿5五位爸爸片酬分别是多少_百 ... 晚安粉是护肤品吗 晚安粉要不要卸妆 心中的榜样初中英语作文 “现代信息高速公路”包括哪些通信技术?它们各有什么优缺点? 三年级讲什么故事比较好 诗情香水网站怎么样?有哪些卖正品香水的网站? 香水网站的设计目的是什么 怀双胞胎二十九周吃什么对宝宝好 159代餐粉七天换食什么意思 159代餐粉七天断食能减多少斤 159代餐粉有没有副作用 159代餐粉过期了能吃吗 通俗唱法的演唱技巧 哪些口红不该买?盘点最不值得买的大牌口红 通俗唱法发声特点 北京大兴社保不满一年孩子可以上幼儿园吗 MLB为什么不设置工资帽? 为什么美国顶级篮球运动员的年收入比橄榄球,棒 美国第一大运动是什么 四十生日祝福语 简短独特