二分法是分治算法的一种特殊形式,利用分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等因素,而二分法,由于其划分的简单和均匀的特点,是查找数据时经常采用的一种有效的方法。
快速排序的实质也是二分法,下面就写一个快速排序+二分法查找的栗子🌰:
1 #include<stdio.h> 2 3 4 //快速排序 5 void QuickSort(int * a,int left,int right) 6 { 7 if(left>right) 8 { 9 return; 10 } 11 int stand=a[left]; 12 int i=left; 13 int j=right; 14 //得到基准数位置 15 while(i!=j) 16 { 17 while(i<j&&a[j]>=stand) 18 { 19 --j; 20 } 21 while(i<j&&a[i]<=stand) 22 { 23 ++i; 24 } 25 if(i<j) 26 { 27 int temp=a[i]; 28 a[i]=a[j]; 29 a[j]=temp; 30 } 31 } 32 //将基准数放入找出的位置 33 a[left]=a[i]; 34 a[i]=stand; 35 //递归 36 QuickSort(a,left,i-1); 37 QuickSort(a,i+1,right); 38 return; 39 } 40 41 42 //递归实现二分法查找 43 int BinarySearch(int * a,int key,int low,int high) 44 { 45 if(low>high||key<a[low]||key>a[high]) //越界处理 46 { 47 return -1; 48 } 49 int middle=(low+high)/2; 50 if(key==a[middle]) 51 { 52 return middle; 53 } 54 if(middle==low||middle==high) 55 { 56 if(key==a[low]) 57 { 58 return low; 59 } 60 if(key==a[high]) 61 { 62 return high; 63 } 64 else 65 { 66 return -1; 67 } 68 } 69 if(key<a[middle]) 70 { 71 return BinarySearch(a,key,low,middle); 72 } 73 if(key>a[middle]) 74 { 75 return BinarySearch(a,key,middle,high); 76 } 77 } 78 79 //循环实现二分法查找 80 int BinarySearchByCircle(int * a,int key,int high) 81 { 82 int low=0; 83 int middle; 84 while(high>=low) 85 { 86 middle=(high+low)/2; 87 if(key==a[middle]) 88 { 89 return middle; 90 } 91 if(key<a[middle]) 92 { 93 high=middle-1; 94 } 95 if(key>a[middle]) 96 { 97 low=middle+1; 98 } 99 } 100 return -1; 101 } 102 103 int main() 104 { 105 int a[]={5,23,5,7,1}; 106 printf("----------------快速排序--------------\n"); 107 QuickSort(a,0,4); 108 for(int i=0;i<5;i++) 109 { 110 printf("%d\n",a[i]); 111 } 112 printf("\n---------------非递归二分法查找元素5的位置-----------------\n"); 113 printf("%d\n",BinarySearchByCircle(a,5,4)); 114 printf("\n---------------递归二分法查找元素5的位置------------------\n"); 115 printf("%d\n",BinarySearch(a,5,0,4)); 116 return 0; 117 }
运行结果为: