描述
借助于快速排序的算法思想,在一组无序的记录中查找给定关键字值等于key的记录。设此组记录存放于数组r[l..n]中。若查找成功,则输出该记录在r数组中的位置及其值,否则显示“not find”信息。
输入
多组数据,每组数据三行。第一行为序列的长度n,第二行为序列的n个元素(元素之间用空格分隔,元素都为正整数),第三行为要查找的key值。当n等于0时,输入结束。
输出
每组数据输出一行。如果查找成功,输出key在数组中的位置(1到n)和key的值,两个数字之间用空格隔开。如果查找失败,输出“not find”。
输入样例 1
5 1 2 43 5 6 43 4 1 9 20 3 21 7 20 30 40 10 1 2 3 10 0
输出样例 1
3 43 not find 4 10
//基于快排思想的查找
#include <iostream>
using namespace std;
void Find(int r[],int target,int len){
int i=0,j=len;
while(i<j){
while(r[i-1]>target&&r[j-1]<target){//如果查找区间左大右小(和target相比),直接向中间收缩
i++;
j--;
}
while(r[i-1]<target&&i<j) i++;//坐标定位到第一个不小于target的元素
if(r[i-1]==target){
cout<<i<<" "<<target<<endl;
return;
}
while(r[j-1]<target&&i<j) j--;//右边定位到第一个不大于target的元素
if(r[j-1]==target){
cout<<j<<" "<<target<<endl;
return;
}
}
cout<<"not find"<<endl;
}
int main(){
int n;
while(cin>>n&&n!=0){
int r[n];
for(int i=1;i<=n;i++) cin>>r[i-1];//输入
int target;
cin>>target;
Find(r,target,n);//查找
}
return 0;
}