排序(冒泡)
創(chuàng)新互聯(lián)公司是一家以成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、品牌設(shè)計、軟件運維、網(wǎng)站推廣、小程序App開發(fā)等移動開發(fā)為一體互聯(lián)網(wǎng)公司。已累計為LED顯示屏等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開發(fā)服務(wù)。
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");
??二分查找是一種簡單高效的查找算法。其思想在生活中廣泛應(yīng)用,比如從圖書館書架上查找書,查字典,測量領(lǐng)域中熱電偶溫度補償?shù)取?/p>
??二分查找可以用 循環(huán) 和 遞歸 兩種方式實現(xiàn)
#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("查無此數(shù)");
}
}
我用一個子函數(shù)實現(xiàn)的,主函數(shù)你自己寫,對你又好處,需要傳入一個數(shù)組和數(shù)組長度n以及要查找的數(shù),如果查找成功,返回x在數(shù)組中的位置,否則返回-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;
}
推薦答案的 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ū)間進行查找
else
low?=?mid?+?1;?//?繼續(xù)在后半?yún)^(qū)間進行查找
}
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);
}
當(dāng)前標(biāo)題:二分查找函數(shù)封裝c語言 c++二分查找函數(shù)
鏈接分享:http://m.kartarina.com/article4/hgpcoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站制作、、靜態(tài)網(wǎng)站、軟件開發(fā)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)