#include stdio.h
創(chuàng)新互聯(lián)提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站、網(wǎng)頁設(shè)計,品牌網(wǎng)站設(shè)計,廣告投放等致力于企業(yè)網(wǎng)站建設(shè)與公司網(wǎng)站制作,10多年的網(wǎng)站開發(fā)和建站經(jīng)驗,助力企業(yè)信息化建設(shè),成功案例突破近千家,是您實現(xiàn)網(wǎng)站建設(shè)的好選擇.
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("查無此數(shù)");
}
}
#includestdio.h
#includestdlib.h
#includetime.h
void xuanzhe(int a[], int n)
{
int i, j, min, t;
for (i=0; in-1; i++) /*要選擇的次數(shù):0~n-2共n-1次*/
{
min = i; /*假設(shè)當(dāng)前下標(biāo)為i的數(shù)最小,比較后再調(diào)整*/
for (j=i+1; jn; j++)/*循環(huán)找出最小的數(shù)的下標(biāo)是哪個*/
{
if (a[j] a[min])
{
min = j; /*如果后面的數(shù)比前面的小,則記下它的下標(biāo)*/
}
}
if (min != i) /*如果min在循環(huán)中改變了,就需要交換數(shù)據(jù)*/
{
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;i1000;++i){
a[i]=rand();
}
xuanzhe(a,1000);
scanf("%d",x);
printf("順序查找:\n");
for(i=0;i1000;++i){
while(x==a[i]){
printf("找到X=%d,a[%d]\n",x,i);
find1=1;
break;
}
}
if(find1==0){
printf("沒有你要找的數(shù)\n");
}
printf("%fs\n",clock()/CLOCKS_PER_SEC);
y=clock();
printf("二分查找:\n");
while(!find2leftright)
{
mid=(left+right)/2;
if(x==a[mid])
find2=1;
else if(xa[mid])
right=mid-1;
else left=mid+1;
}
if(find2==1)
printf("找到x=%d ,a[%d]\n",x,mid);
else
printf("沒有你要找的數(shù)\n");
printf("%fs\n",(clock()-y)/CLOCKS_PER_SEC);
}
排序(冒泡)
void(student*tmp,int size)
{
for(int j=0;jn-1;j++)
{
for(k=0;kn-1-j;k++)
{
if(strcmp(tmp[k].name,tmp[k+1].name)0)
{
student tm=tmp[k];
tmp[k]=tmp[k+1];
tmp[k]=tm;
}
}
}
}
int findOn(student*test,char*name,int begin,int end)
{
if(beginend)
{
return -1;//沒找到
}
int mid=end+((end-begin)/2);
if(strcmp(test[mid].name,name)==0)
{
return mid;
}elseif((strcmp(test[mid].name,name)0)
{
return findOn(test,name,mid+1,end);
}else
{
return findOn(test,name,begin,mid-1);
}
}
int find(student *test,int size,char* studentname)
{
return findOn(test,strudentname,0,size-1);
}
find(student,3000,"testname");
再來一個快速排序
void quickSort(student *test arr,int startPos, int endPos)
{
int i,j;
student key;
key=arr[startPos];
i=startPos;
j=endPos;
while(ij)
{
while(strcmp(arr[j].name,key.name)=0 ij)--j; //第一個比他小
{
student tmp=arr[i];
arr[i]=arr[j]; //moveed
arr[j]=tmp;
i++;
}
while((strcmp(arr[i].name,key.name)=0 ij)++i; //第一個比他大,
{
student tmp=arr[j];
arr[j]=arr[i];
arr[i]=tmp;
j--;
}
}
arr[i]=key; //賦值
if(i-1startPos) quickSort(arr,startPos,i-1);
if(endPosi+1) quickSort(arr,i+1,endPos);
}
quicksort(test,0,3000-1);
find(student,3000,"testname");
折半查找法也稱為二分查找法,它充分利用了元素間的次序關(guān)系,采用分治策略,可在最壞的情況下用O(log n)完成搜索任務(wù)。它的基本思想是,已知一個有n個元素的有序序列, 將n個元素分成個數(shù)大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,算法終止。如果xa[n/2],則我們只要在數(shù)組a的左半部繼續(xù)搜索x(這里假設(shè)數(shù)組元素呈升序排列)。如果xa[n/2],則我們只要在數(shù)組a的右半部繼續(xù)搜索x, 直到找到x或者是沒有找到!
如果是常規(guī)的方法的話那么我們可以通過循環(huán)的方式, 按照上面說的算法, 找到則退出循環(huán), 否則繼續(xù)循環(huán)直到左下標(biāo)位置小于或者等于右下標(biāo)的位置.
按兄弟你的意思是要用遞歸方法進(jìn)行搜索, 那么大概還是上面的算法, 只是把循環(huán)的方式改成遞歸方式: 如果沒找到,則確定新的搜索范圍, 即左右下標(biāo)新位置, 然后把新的參數(shù)傳給函數(shù)繼續(xù)調(diào)用函數(shù)進(jìn)行遞歸搜索!!
遞歸方式實現(xiàn)詳細(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};//假設(shè)一個已知的有序且是升序數(shù)列
int result = 0;//查找的結(jié)果
int x = 13;//假設(shè)我們要查找的數(shù)是13
int left = 0;//序列開始下標(biāo)
int right = ARRAY_SIZE - 1;//序列結(jié)尾下標(biāo)
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;
}
希望對兄弟你有幫助!
推薦答案的 code 有問題,并沒有考慮到若待查數(shù)的下標(biāo)是 0 怎么辦?所以若順序表中不存在待查元素?應(yīng)該 return?-1
加上主函數(shù)的最后兩行調(diào)用兩次查找函數(shù)很多余,代碼顯得不夠簡練。
建議改成:
#include?stdio.h
#include?stdlib.h
int?Search(int?*a,?int?key)
{
//?在順序表中折半查找?key的數(shù)據(jù)元素。若找到,則函數(shù)值為
int?low?=?0,?mid;?//?該元素的數(shù)組下標(biāo);否則為0。
int?high?=?14;
while?(low?=?high)
{
mid?=?(low?+?high)?/?2;
if?(key?==?a[mid])
return?mid;?//?找到待查元素
else?if?(key??a[mid])
high?=?mid?-?1;?//?繼續(xù)在前半?yún)^(qū)間進(jìn)行查找
else
low?=?mid?+?1;?//?繼續(xù)在后半?yún)^(qū)間進(jìn)行查找
}
return?-1;?//?順序表中不存在待查元素
}
void?main()
{
int?*a,?key,?i;
int?b[15]?=?{0};
a?=?b;
printf("請自小到大輸入15個整數(shù):\n");
for?(i?=?1;?i?=?15;?i++)
{
scanf("%d",?b[i?-?1]);
printf("\n");
}
printf("請輸入你要查找的數(shù):\n");
scanf("%d",?key);
i?=?Search(a,?key);
if?(-1?==?i)
printf("你要查找的數(shù)不在目標(biāo)數(shù)組中!\n");
else
printf("你要查找的數(shù)的數(shù)組下標(biāo)為?%d?\n",?i);
}
好久不寫了
寫一個程序,建立N元整型數(shù)組,然后輸入查找的整數(shù)x,查找x是否包含在數(shù)組中,查找用函數(shù)實現(xiàn),若查找成功,返回x在數(shù)組中的第一次出現(xiàn)的下標(biāo),查找失敗,返回-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=rx!=a[m])
if(xa[m]) {r=m-1;m=(h+r)/2;}
else {h=m+1;m=(h+r)/2;}
if(hr) return -1; /*查找失敗,返回-1*/
return m; /*查找成功,返回有效下標(biāo)m */
}
void upinsert(int a[],int i) /*插入排序 (升序)*/
{int x,j;
x=a[i];j=i-1;
while(j=0a[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;kN;k++) {scanf("%d",a+k);upinsert(a,k);}
printf("input x=") ;scanf("%d",x);
n=locate(a,x);
for(k=0;kN;k++) printf("%4d",a[k]);
printf("\n fist position=%d\n",n);
}
沒有錯誤,我試過了