算法基础之查找——顺序查找和二分查找

           这一节,介绍以数组为载体的查找方法,介绍两种查找方法:顺序查找和二分查找

          (1)顺序查找

          顺序查找,顾名思义,按照元素索引的顺序进行查找以匹配要查找的目标,是针对无序数组的通用查找手段。

        算法思路是:从数组的首个元素开始,逐个匹配数组元素和查找目标,若找到,返回找到的元素索引,若遍历完没有找到,则返回-1。

          (2)二分查找

          二分查找,又名折半查找,是处理已排序数组的快速查找方式。

        算法思路是:每次对数组区间中间的元素和查找目标进行匹配和比较,如果不匹配,根据大小关系选择左区间或者右区间再进行比较,直到区间只剩下一个元素或者匹配为止。若找到(匹配),返回找到的元素索引,若没有找到,则返回-1。

       以整型数组为例,给出这两个查找方法的C++实例。

  #include<iostream>  
    using namespace std;  
	void QuickSort(int num[],int left,int right){
		if(left>=right) return;//待排序区间只有一个元素 终止
		int key,i,j;
        i=left;//从左往右查找变量
		j=right;//从右往左查找变量
		key=num[left];//参考数
		while(i<j){
			while(num[j]>=key && j>i) j--;//从右往左查找
			while(num[i]<=key && i<j) i++;//从左往右查找
			if(i<j){
			int tmp=num[i];
			num[i]=num[j];
			num[j]=tmp;
			}  //交换
		}
		num[left]=num[i];
		num[i]=key;//参考数归位
		QuickSort(num,left,i-1);//对i左边区间排序
		QuickSort(num,i+1,right);//对i右边区间排序

	}

	int Search(int num[],int n,int find){
		for(int i=0;i<n;i++){
			if(num[i]==find)  return i;
		}
		return -1;
	}

	int BinarySearch(int num[],int n,int find){
		int left,right,mid;
		left=0;
		right=n-1;
		while(left<=right){
			mid=left+(right-left)/2;//防止数组越界  不写直接加和
			if(mid<find) left=mid+1;
			else if(mid>find) right=mid-1;
			else return mid;
		}
		return -1;
	}

    int main()  
    {  
		
	   int num[10]={4,7,1,0,8,9,3,2,5,6};
	     int find;
	    for(int i=0;i<10;i++) cout<<num[i]<<" ";
		cout<<endl;
		//case 1
		cout<<"输入要查找的数:"<<endl;
	   cin>>find;
	   cout<<"查找的索引为:"<<endl;
	    cout<<Search(num,10,find)<<endl;
		//case 2
		cout<<"对数组进行快速排序变为有序数组:"<<endl;
	   QuickSort(num,0,9);
	   for(int i=0;i<10;i++) cout<<num[i]<<" ";
	   cout<<endl;
	   cout<<"输入要查找的数:"<<endl;
	   cin>>find;
	   cout<<"查找的索引为:"<<endl;
	   cout<<BinarySearch(num,10,find)<<endl;
		system("pause");
		return 0;
    }  

点赞