int BSearch(int a[],int x, int low, int high){
int mid;
if(low>high) return -1;
if(x==a[mid]) return mid;
if(x<a[mid]) return(BSearch(a,x,low,mid-1));
else return(BSearch(a,x,mid+1,high));
}
非递归版本,不能找到边界(多值问题:查询值在其内多种情况)
int BSearch(int a[],int key, int n){
int low, high, mid;
low=0;high = n-1;
while(low<=high){
mid =(low+high)/2;
if(a[mid]==key) return mid;
else if(a[mid]<key) low=mid+1;
else high = mid -1;
}
return -1;
}
int rotateBinarySearch(int a[],int aLength, int key){
}
int rotateBinarySearch(int a[],int aLength, int key){
int low =0;
int high = aLength-1;
while(low<=high){
int mid = low + ((high-low)>>1);
if(a[mid]==key) return mid;
if(a[low]<=a[mid]){//低端有序
if(key>a[low]&&key<a[mid]) high = mid -1;
else low = mid +1;
}
else //高端有序
{
if(key<a[mid]&&key<=a[high])
low = mid +1;
else
high = mid -1;
}
}
}
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + 1, last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}
bool MergeSort(int a[], int n)
{
int *p = new int[n];
if (p == NULL)
return false;
mergesort(a, 0, n - 1, p);
delete[] p;
return true;
}
问题:在n个元素中找出最大值和最小值。
void MaxMin(Typea[],int n,Type&max,Type &min){}
简单的查找算法:
void MaxMin(Type a[],int n,Type &max,Type &min)
{
max=min =a[0];
for(int i=1;i<n;i++)
{ if(a[i]>max) max=a[i];
if(a[i]<min) min=a[i];
}
}
void MaxMin(int i,int j,Type &max,Type &min)
{
if(i==j) max=min=a[i];//分解的最小问题
else if(i==j-1){//分解的另一种的最小问题
if(a[i]<a[j]){ max=a[j];min=a[i];}
else{max=a[i];min=a[j];}
}
else {
int mid=(i+j)/2;
Type max1,min1;
//分解成子问题
MaxMin(i,mid,max,min);
MaxMin(mid+1,j,max1,min1);
// 合并子问题的解
if(max<max1) max=max1;
if(min<min1) min=min1;
}
}
思路:
const double eps = le-6;
double my_sqrt(const double a){
double left = 0; right = a<1? 1:a;
while(left<right){
double mid = (left + right)/2;
double temp = mid * mid ;
if(temp<a) left = mid + eps;
else if (temp > a ) right = mid - eps;
else return mid;
}
reutrn left;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务