當前位置:首頁 » 編程語言 » c語言實現二分查找
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言實現二分查找

發布時間: 2022-02-04 18:38:33

c語言,利用二分查找法實現一維數組的查找

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void xuanzhe(int a[], int n)
{
int i, j, min, t;

for (i=0; i<n-1; i++) /*要選擇的次數:0~n-2共n-1次*/
{
min = i; /*假設當前下標為i的數最小,比較後再調整*/
for (j=i+1; j<n; j++)/*循環找出最小的數的下標是哪個*/
{
if (a[j] < a[min])
{
min = j; /*如果後面的數比前面的小,則記下它的下標*/
}
}

if (min != i) /*如果min在循環中改變了,就需要交換數據*/
{
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
}
int main(){
int i,n,x;
int mid,left=0,right=999;
int find1=0,find2=0;
double y;
int a[1000];
for(i=0;i<1000;++i){
a[i]=rand();
}
xuanzhe(a,1000);
scanf("%d",&x);
printf("順序查找:\n");
for(i=0;i<1000;++i){
while(x==a[i]){
printf("找到X=%d,a[%d]\n",x,i);
find1=1;
break;
}
}
if(find1==0){
printf("沒有你要找的數\n");
}

printf("%fs\n",clock()/CLOCKS_PER_SEC);
y=clock();
printf("二分查找:\n");
while(!find2&&left<right)
{
mid=(left+right)/2;
if(x==a[mid])
find2=1;
else if(x<a[mid])
right=mid-1;
else left=mid+1;
}
if(find2==1)
printf("找到x=%d ,a[%d]\n",x,mid);
else
printf("沒有你要找的數\n");
printf("%fs\n",(clock()-y)/CLOCKS_PER_SEC);
}

⑵ 用C語言寫二分查找的代碼!!!

推薦答案的 code 有問題,並沒有考慮到若待查數的下標是 0 怎麼辦?所以若順序表中不存在待查元素應該 return-1

加上主函數的最後兩行調用兩次查找函數很多餘,代碼顯得不夠簡練。

建議改成:

#include<stdio.h>
#include<stdlib.h>

intSearch(int*a,intkey)
{
//在順序表中折半查找key的數據元素。若找到,則函數值為
intlow=0,mid;//該元素的數組下標;否則為0。
inthigh=14;
while(low<=high)
{
mid=(low+high)/2;
if(key==a[mid])
returnmid;//找到待查元素
elseif(key<a[mid])
high=mid-1;//繼續在前半區間進行查找
else
low=mid+1;//繼續在後半區間進行查找
}
return-1;//順序表中不存在待查元素
}
voidmain()
{
int*a,key,i;
intb[15]={0};
a=b;

printf("請自小到大輸入15個整數: ");
for(i=1;i<=15;i++)
{
scanf("%d",&b[i-1]);
printf(" ");
}
printf("請輸入你要查找的數: ");
scanf("%d",&key);
i=Search(a,key);
if(-1==i)
printf("你要查找的數不在目標數組中! ");
else
printf("你要查找的數的數組下標為%d ",i);
}

⑶ C語言二分查找代碼(跪求大蝦幫忙)!

這個不是很簡單嗎
沒有講過

⑷ 怎樣寫二分查找演算法的程序(用C語言實現)

我用一個子函數實現的,主函數你自己寫,對你又好處,需要傳入一個數組和數組長度n以及要查找的數,如果查找成功,返回x在數組中的位置,否則返回-1
int search(int *a,int x)
{ int low=0,high=n-1,mid,flag=-1;
while(low<=high)
{ mid=(low+high)/2;
if(a[mid]==x) return mid;
else if(a[mid]>low) low=mid+1;
else high=mid-1;
}
return flag;
}

⑸ C語言 二分查找演算法 用遞歸實現 我改動了一下

本人直接打出來的,並未在平台上編譯運行過,所以可能會有語法錯位,還請自行調試更改
#include<stdio.h>

int RecorBinarySearch(int a[], int, int, int);
int main(void)
{
int i=0, n, m, key;
int a[10000], c[10000];

scanf("%d", &n);
scanf("%d", &m);

printf("提示:輸入%d個整數且必須按升序排列。\n", n);
for(i=0; i<n; i++){
scanf("%d", &a[i]);
}
printf("提示:輸入%d個預查找的數。\n", m);
for(i=0; i<m; i++){
scanf("%d", &key);
c[i] = RecorBinarySearch(a, key, 0, n-1);
}
printf("提示:輸出預查找的數在數組中的位置。(-1代表未找到)\n");
for(i=0; i<m; i++) {
printf("%d ", c[i]);
}
return 0;
}

int RecorBinarySearch(int a[], int key, int low, int high)
{
int nRet;
if(low > high)
nRet = -1;
else {
int mid = (high + low) / 2;
if(key == a[mid])
nRet = mid;
else if(key > a[mid])
nRet = RecorBinarySearch(a, key, mid+1, high);
else if(key < a[mid])
nRet = RecorBinarySearch(a, key, low, mid-1);
}
return nRet;
}

⑹ C語言二分查找

if(key==a[mid]) return mid; 這句就是罪魁禍首。呵呵你是想用return來結束while循環吧。用錯了。
找到結果後,你應該是把結果輸出出來,而不是用return。return語句是返回整個函數的,在你的程序里main函數就結束了,你當然看不到任何結果了。
改為:
if(key==a[mid]) break; *這行是結束while循環的。而不是你所用的return*/
}

⑺ c語言。利用二分查找法實現一維數組的查找

簡單的一個:

intbinary_search(inta[],intlow,inthigh,intkey){
intmid;
while(low<=high){
mid=(low+high)/2;
if(a[mid]==key){
returnmid;
}
elseif(a[mid]>key){
high=mid-1;
}
else{
low=mid+1;
}
}
return-1;
}

⑻ C語言遞歸函數如何實現二分搜索演算法

折半查找法也稱為二分查找法,它充分利用了元素間的次序關系,採用分治策略,可在最壞的情況下用O(log n)完成搜索任務。它的基本思想是,已知一個有n個元素的有序序列, 將n個元素分成個數大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,演算法終止。如果x<a[n/2],則我們只要在數組a的左半部繼續搜索x(這里假設數組元素呈升序排列)。如果x>a[n/2],則我們只要在數組a的右半部繼續搜索x, 直到找到x或者是沒有找到!

如果是常規的方法的話那麼我們可以通過循環的方式, 按照上面說的演算法, 找到則退出循環, 否則繼續循環直到左下標位置小於或者等於右下標的位置.

按兄弟你的意思是要用遞歸方法進行搜索, 那麼大概還是上面的演算法, 只是把循環的方式改成遞歸方式: 如果沒找到,則確定新的搜索范圍, 即左右下標新位置, 然後把新的參數傳給函數繼續調用函數進行遞歸搜索!!

遞歸方式實現詳細代碼如下:

#include <stdio.h>

#define ARRAY_SIZE 10
#define NOT_FOUND -1

int BinarySearch(int array[], int left, int right, int NumToSearch)
{
int mid = (left + right) / 2;

if (left <= right)
{
if (NumToSearch == array[mid])
{
return mid;
}
else if (NumToSearch < array[mid])
{
right = mid - 1;
return BinarySearch(array, left, right, NumToSearch);
}
else
{
left = mid + 1;
return BinarySearch(array, left, right, NumToSearch);
}
}

return NOT_FOUND;
}

int main()
{
int a[ARRAY_SIZE] = {2, 5, 6, 7, 13, 20, 22, 27, 112, 222};//假設一個已知的有序且是升序數列
int result = 0;//查找的結果
int x = 13;//假設我們要查找的數是13
int left = 0;//序列開始下標
int right = ARRAY_SIZE - 1;//序列結尾下標

result = BinarySearch(a, left, right, x);
if (result == NOT_FOUND)
{
printf("Not Found!\n");
}
else
{
printf("Found %d in array a, it is a[%d]\n", x, result);
}

return 0;

}

希望對兄弟你有幫助!

⑼ C語言二分查找法

#include <stdio.h>

int binfind(int val[] , int num , int value)
{
int start = 0;
int end = num - 1;
int mid = (start + end)/2;
while(val[mid] != value && start < end)
{
if (val[mid] > value)
{
end = mid - 1;
}
else if (val[mid] < value)
{
start = mid + 1;
}
mid = ( start + end )/2;
}
if (val[mid] == value)
return mid;
else
return -1;
}

int main()
{
int nums[] = {1 , 3 , 4 ,7 ,8 , 12 ,45 ,67 ,97 ,123 ,456 ,675 ,1111 , 4534 , 4563};
int result = binfind(nums , sizeof(nums) / sizeof(nums[0]) , 45);
if (result < 0)
{
printf("查無此數");
}

}

⑽ 二分查找C語言

你的錯誤挺多的,首先是忘了定義int x;

其次是對strlen()函數的用法錯了,你的數組s[]是整型,但是strlen(char*ch),括弧里的只能寫字元型數組的變數名,你要求整型數組的長度可以這樣求n=sizeof(s)/sizeof(int);

最後一個也是挺致命的錯誤就是Bsearch()函數里的while循環應該是while(low<=high),而不是while(low<high);以及對break的使用,你也用錯了,break是跳出循環的意思,你用在這里就是不執行while的意思,如果你非要用的話應該是continue,然而事實上你什麼也不寫就好了。具體代碼如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
intBsearch(ints[],intx,intn);
intmain(void)
{
inti;
intn;
intx;//這里你沒寫
ints[10]={1,2,3,4,5,6,7,8,9,10};
n=sizeof(s)/sizeof(int);//這里應該改成這樣
printf("%dpleaseinputx:",n);
scanf("%d",&x);
i=Bsearch(s,x,n);//這里不要寫成s[]
printf(" %d",i);
system("pause");
return0;
}
intBsearch(ints[],intx,intn)
{
intlow,high,mid;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(s[mid]>x)
{
high=mid-1;
continue;//這行不寫也行,下面也是
}
elseif(s[mid]<x)
{
low=mid+1;
continue;
}
else
{
returnmid;
}
}
return-1;
}