改进的二分算法描述
改进的二分算法描述
设数组A[n];int,head,tail,mid;目标数字是target.算法针对的是有序的数字序列进行的查找
(1) 初始head=0,tail=n-1;{if(target==A[head]|| target==A[tail])do stop;else do(2)}
(2) Set int mid=(head+tail)/2;{if(target==A[mid]) do stop;if(target>A[mid]) do head=mid+1;if(target<A[mid]) do tail=mid-1;};do (3)
(3) if(head<=tail)do(2) ; else(标准着没有找到) do stop;
ps:为什么等于的时候还要执行,这是因为有一种可能是刚好是相等的时候,然后取mid时找到。
1 // try.cpp : Defines the entry point for the console application. 2 // 3 /************************************************************************/ 4 /* 二分查找算法,对无序的先进行排序,然后再用此算法 */ 5 /************************************************************************/ 6 #include "stdafx.h" 7 #include"algorithm" 8 using namespace std; 9 /*bool compare(int x,int y){ 10 return x>y; 11 }*/ 12 int main(){ 13 int a[7]={1,3,2,6,4,9,6 14 }; 15 int target; 16 int head=0; 17 int tail=6; 18 int mid; 19 sort(a,a+7);//升序 20 while(scanf("%d",&target)!=EOF){ 21 22 //sort(a,a+7,compare); 23 24 if (target==a[head]||target==a[tail]) 25 { 26 printf("I did\n"); 27 continue; 28 } 29 while (head<=tail)//第三步,结束的条件 30 { 31 mid=(head+tail)/2; 32 if(target>a[mid])head=mid+1;//因为是升序,所以是将mid+1; 33 if (target<a[mid])tail=mid-1; 34 if(target==a[mid])break; 35 } 36 if(head>tail)printf("No Found\n");//判断跳出循环的原因是>,还是因为break; 37 else printf("I did\n"); 38 } 39 return 0; 40 }
不要做一个似懂非懂的人,做一个脚踏实地的程序员