C++程序设计 (第三版) 谭浩强 习题5.8
习题 5.8 有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
方法1:
#include <iostream>
using namespace std;
int main(){
int a[15] = {99, 87, 76, 64, 55, 52, 49, 46, 43, 39, 37, 35, 33, 29, 19};
int num, low, high, mid;
cout<<"Please enter number: ";
cin>>num;
for(high = 0, low = 14, mid = (high + low) / 2; high <= low; mid = (high + low) / 2){
if(num > a[mid]) low = mid - 1;
else if(num < a[mid]) high = mid + 1;
else if(num == a[mid]){
cout<<num<<" is No."<<mid+1<<" number."<<endl;
break;
}
}
if(high > low) cout<<"No match!"<<endl;
system("pause");
return 0;
}
方法2:使用指针,函数的模块化设计,分配内存
#include <iostream>
#include <iomanip>
using namespace std;
const int N = 15;
void inputArr(int *arr, int n){
cout<<"Enter "<<n<<" Numbers: ";
for(int i = 0; i < n; i++){
cin>>arr[i];
}
}
void descendingSort(int *arr, int n){
int temp;
for(int i = 0; i < n; i++){
for(int j = i + 1; j < n; j++){
if(arr[i] < arr[j]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
void outputArr(int *arr, int n){
cout<<"Array: ";
for(int i = 0; i < n; i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
void searchNum(int *arr, int n){
int num;
cout<<"Enter Search Number: ";
cin>>num;
int low = 0;
int high = n - 1;
int mid;
int sign = 0;
while(low <= high){
mid = (low + high) / 2;
if(num > arr[mid]){
high = mid - 1;
}
else if(num < arr[mid]){
low = mid + 1;
}
else{
sign = 1;
cout<<"The search number is No."<<mid + 1<<endl;
break;
}
}
if(sign == 0){
cout<<"Cannot find this number!"<<endl;
}
}
int main(){
int *arr = new int[N];
inputArr(arr, N);
descendingSort(arr, N);
outputArr(arr, N);
searchNum(arr, N);
delete(arr);
system("pause");
return 0;
}