㈠ 用c語言編寫順序查找和二分查找(折半查找)
#include<stdio.h>
#defineLENGTH20
voidSequenceSearch(int*fp,intLength);
voidSearch(int*fp,intlength);
voidSort(int*fp,intlength);
voidmain()
{
intcount;
intarr[LENGTH];
printf("請輸入你的數據的個數: ");
scanf("%d",&count);
printf("請輸入%d個數據 ",count);
for(inti=0;i<count;i++)
{
scanf("%d",&arr[i]);
}
intchoise=0;
do
{
printf("1.使用順序查詢. 2.使用二分查找法查找. 3.退出 ");
scanf("%d",&choise);
if(choise==1)
SequenceSearch(arr,count);
elseif(choise==2)
Search(arr,count);
elseif(choise==3)
break;
}while(choise==1||choise==2||choise==3);
}
voidSequenceSearch(int*fp,intLength)
{
intdata;
printf("開始使用順序查詢. 請輸入你想要查找的數據. ");
scanf("%d",&data);
for(inti=0;i<Length;i++)
if(fp[i]==data)
{
printf("經過%d次查找,查找到數據%d. ",i+1,data);
return;
}
printf("經過%d次查找,未能查找到數據%d. ",i,data);
}
voidSearch(int*fp,intlength)
{
intdata;
printf("開始使用順序查詢. 請輸入你想要查找的數據. ");
scanf("%d",&data);
printf("由於二分查找法要求數據是有序的,現在開始為數組排序. ");
Sort(fp,length);
printf("數組現在已經是從小到大排列,下面將開始查找. ");
intbottom,top,middle;
bottom=0;
top=length;
inti=0;
while(bottom<=top)
{
middle=(bottom+top)/2;
i++;
if(fp[middle]<data)
{
bottom=middle+1;
}
elseif(fp[middle]>data)
{
top=middle-1;
}
else
{
printf("經過%d次查找,查找到數據%d. ",i,data);
return;
}
}
printf("經過%d次查找,未能查找到數據%d. ",i,data);
}
voidSort(int*fp,intlength)
{
printf("現在開始為數組排序,排列結果將是從小到大. ");
inttemp;
for(inti=0;i<length;i++)
for(intj=0;j<length-i-1;j++)
if(fp[j]>fp[j+1])
{
temp=fp[j];
fp[j]=fp[j+1];
fp[j+1]=temp;
}
printf("排序完成! 下面輸出排序後的數組: ");
for(intk=0;k<length;k++)
{
printf("%5d",fp[k]);
}
printf(" ");
}
㈡ 如何編寫二分查找和順序查找的C語言代碼
二分查找:
int search(int a[],int x,int n)
{
int mid=0;
int low=0;
int high=n;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)
{ return mid; }
else if(x<a[mid])
{ high=mid-1; }
else
{ low=high+1; }
}
return -1;
}
順序查找:
int search(int a[],int x,int n)
{
int i;
for(i=0;i<n;i++)
{
if(a[i]==x)
return i;
else
return -1;
}
}
㈢ c語言如何實現-數組排序,二分查找
給定已經排好序的n個元素,現在要在這n個元素中找出一特定元素x。順序搜索的方法是逐個比較,直至找出元素。二分搜索則利用了元素間的次序關系,可大大提高效率。二分法的基本思想是將n個元素分成個數大致相同的兩半,取a[n/2]與x作比較。如果x==a[n/2],則終止。如果x<a[n/2],則只需在數組的左半部分繼續搜索。如果x>a[n/2],則只需在右半部分搜索。本題要求利用上一題得到的數組進行順序查找和二分查找,分別為兩種查找方法計時。
#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語言編程二分查找
好久不寫了
寫一個程序,建立N元整型數組,然後輸入查找的整數x,查找x是否包含在數組中,查找用函數實現,若查找成功,返回x在數組中的第一次出現的下標,查找失敗,返回-1
源程序:
#include"stdio.h"
#define N 10
int locate(int a[N],int x)
{int h,r,m;
h=0;r=N-1;m=(h+r)/2;
while(h<=r&&x!=a[m])
if(x<a[m]) {r=m-1;m=(h+r)/2;}
else {h=m+1;m=(h+r)/2;}
if(h>r) return -1; /*查找失敗,返回-1*/
return m; /*查找成功,返回有效下標m */
}
void upinsert(int a[],int i) /*插入排序 (升序)*/
{int x,j;
x=a[i];j=i-1;
while(j>=0&&a[j]>x) {a[j+1]=a[j];j--;}
a[j+1]=x;
}
void main()
{int a[N],x,k,n;
printf("input %d integers:\n",N);
for(k=0;k<N;k++) {scanf("%d",a+k);upinsert(a,k);}
printf("input x=") ;scanf("%d",&x);
n=locate(a,x);
for(k=0;k<N;k++) printf("%4d",a[k]);
printf("\n fist position=%d\n",n);
}
沒有錯誤,我試過了
㈤ 編寫無序順序表順序查找、有序順序表順序查找、二分查找演算法。用c語言。高分急求!
int IdxSerch(SeqList A[],IdxType index[],int b,KeyType k,int n) {
//分塊查找關鍵字為k的記錄,索引表為
index[0..b-1]
int low=0,high=b-1,mid,i;
int s=n/b; //每塊記錄個數
while(low<=high)
{
//在索引表中進行二分查找,找到的位置放在low中
mid=(low+high)/2;
if(index[mid].key<k) low=mid+1;
else high=mid-1;
}
if(low<b)
{
//在順序表中順序查找
for(i=index[low].link;i<=index[low].link+s-1 && i<n;i++)
if(A[i].key==k) return i;
return -1;
}
return -1;
}
typedef struct node
{
KeyType key;
//結點中的關鍵字
struct node *lchild,*rchild; //左、右孩子指針
}BsTree;
BsTree *BstSeareh(BsTree *BST,KeyType k ,BsTree **parent)
{
BsTree *p=BST,*q=NULL; //p指向根結點,q指向*p的雙親
while(p!=NULL)
{
if(k==p->key)
{ //查找成功
*parent=q;
return (p);
}
q=p;
if(k<p->key) p=p->lchild;
//在左子樹中查找
else p=p->rchild; //在右子樹中查找
}
*parent=q;
return (p);
//查找失敗,返回空
}
㈥ c語言中如何將順序表排序並實現二分法查找
voidInsertSort(sqR)
這個函數是按值傳遞參數的。換句話說,你的順序表在傳遞的時候被復制了一遍,然後這個函數收到的是一個副本,然後這個程序也許成功排序了這個副本,但是你原來的順序表並沒有改變。你可以考慮傳遞這個順序表的指針。比如這樣
voidInsertSort(sq*pR)
{
sqR=*pR;
//以下不變
...
}
調用的時候傳遞R的地址
InsertSort(&R);