参考书籍:数据结构与算法分析(C++)(第二版)中文版.pdf
例3.1 下面是查找一维n元整数数组中最大元素的算法。该算法依次遍历数组的元素,并保存当前的最大元素,称为“最大元素顺序搜索”。下面就是使用C++语言编写的程序
#include <iostream>
using namespace std;
int largest(int array[],int n)
{
int currlarge = 0;
for (int i=1; i<n; i++)
if(array[currlarge]<array[i])
currlarge = i;
return currlarge;
}
int main()
{
int a[10]= {35,78,10,50,99,34,65,24,64,23};
int n=sizeof(a)/sizeof(int);
for (int i=0; i<n; i++)
cout << a[i] << " " ;
cout << endl;
cout << "The largest position" << endl;
cout << largest(a,n) << endl;
cout << "The largest number" << endl;
cout << a[largest(a,n)] << endl;
return 0;
}
二分法程序
#include <iostream>
using namespace std;
int binary(int array[], int n, int K){
int l = -1;
int r = n;
while(l+1 != r){
int i= (l+r)/2;
if (K < array[i]) r = i;
if (K == array[i]) return i;
if (K > array[i]) l=i;
}
return n;
}
int main()
{
int a[16]= {11,13,21,26,29,36,40,41,45,51,54,56,65,72,77,83};
int n=sizeof(a)/sizeof(int);
for (int i=0; i<n; i++)
cout << a[i] << " " ;
cout << endl;
cout << "The search position" << endl;
cout << binary(a,n,45) << endl;
return 0;
}
3.16改进二分法,有重复元素是返回第一个下标
#include <iostream>
using namespace std;
int binary(int array[], int n, int K)
{
int l = -1;
int r = n;
int flag = 0;
while(l+1 != r)
{
int i= (l+r)/2;
if (K < array[i]) r = i;
if (K == array[i])
{
r = i;
flag = 1;
}
if (K > array[i]) l=i;
}
if (flag)
return r;
else
return n;
}
int main()
{
int a[16]= {11,13,21,26,29,45,45,45,45,51,54,56,65,72,77,83};
int n=sizeof(a)/sizeof(int);
for (int i=0; i<n; i++)
cout << a[i] << " " ;
cout << endl;
cout << "The search position" << endl;
cout << binary(a,n,45) << endl;
return 0;
}
3.17改进二分法,没有这个元素使找前一个元素
个人思路是两轮查找,一轮确定有没有这个元素,如果有,直接出结果,如果没有,找到前一个元素再查第二轮
#define ERROR -1
#include <iostream>
using namespace std;
int binary(int array[], int n, int K)
{
int l = -1;
int r = n;
int flag = 0;
if (K < array[0]) return ERROR;
while(l+1 != r){
int i= (l+r)/2;
if (K < array[i]) r = i;
//if (K == array[i]) return i;
if (K == array[i])
{
l = i;
flag = 1;
}
if (K > array[i]) l = i;
}
if (flag)
return r;
else
{
K = array[r-1];
int l = -1;
int r = n;
while(l+1 != r)
{
int i= (l+r)/2;
if (K < array[i]) r = i;
if (K == array[i]) r = i;
if (K > array[i]) l=i;
}
return r;
}
}
int main()
{
int a[16]= {11,13,21,26,29,45,45,45,45,51,54,56,65,72,77,83};
int n=sizeof(a)/sizeof(int);
for (int i=0; i<n; i++)
cout << a[i] << " " ;
cout << endl;
cout << "The search position" << endl;
cout << binary(a,n,10) << endl;
return 0;
}