程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 查找系列之簡述順序查找和二分查找

查找系列之簡述順序查找和二分查找

編輯:C++入門知識

順序查找和二分查找

一、順序查找思想

1、 從表的一端開始掃描,順序掃描線性表,依次掃描到的結點關鍵字與給定的值K相比較.如果當前掃描到的結點的關鍵字與給定的值K相等,則查找成功;若掃描結束後,仍未找到關鍵字與給定的值K相等,則查找失敗;

2、順序查找既適用於順序存儲結構,也適用於線性表的鏈式存儲結構;

3、ASL= (n+1)/2為其平均查找長度

4、優點:算法簡單,對存儲結構形式沒有要求 缺點:浪費空間,當長度非常大是效率低

5、算法描述:

/**
*順序查找
*@param int a[] 表示查找的庫
*@param int length 表示數組a的長度
*@param int key 表示需要查找的目標對象
*@return  int
*/
int orderSerch(int a[],int length,int key){
	int count = 0;
	if(key >a[length-1]){
	      cout<<"您輸入的元素不存在!"<a[i] ){
			count++;
		    i++;    
		}else if(key == a[i]){
			cout<<"順利查到了,查找成功!"<二、二分查找基本思想

二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。

折半查找法也稱為二分查找法,它充分利用了元素間的次序關系,采用分治策略,可在最壞的情況下用O(log n)完成搜索任務。它的基本思想是,將n個元素分成個數大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,算法終止。如 果xa[n/2],則我們只要在數組a的右 半部繼續搜索x。這些都是從百度文庫copy過來的只是便於理解,由於此算法太簡單了,這裡就不多說了。

貼上代碼:

/**
*二分查找
*@param int a[] 表示查找的庫
*@param int length 表示數組a的長度
*@param int key 表示需要查找的目標對象
*@return  int
*/
int BinarySerch(int a[],int length ,int key){
	     int count = 0;
	     if(key >a[length-1]){
	           cout<<"您輸入的元素不存在!"< key ){
			         high = mid-1;
			  }
		 }
		 if(high == mid&& a[mid] != key ){
			   cout<<"查找次數:"<貼上全部代碼:這裡我把順序查找和二分查找弄在了一起,很便於觀察和學習,而且使用快排來進行排序,對於向我這樣的初學者是一個完整的可學習的代碼。

#include
#include
#include
using namespace std;
int recode[2]={0};
//快速排序以遞歸實現的代碼
void QKSort(int a[],int low,int high)
{
    if(low>=high)
    {
          return;
    }
    int i = low;
    int j = high;
    int  key = a[low];
	while(i != j){
		for(;j != i;j--){
			if(a[j] <= key ){
			     a[i] = a[j];
				 break;
			}
		}
		for(;i != j;i++){
			if(a[i] > key){
			     a[j] = a[i];
				 break;
			
			}
		}
	} 


    a[i]=key;
    QKSort(a,low,i-1);
    QKSort(a,j+1,high);
}
/**
*順序查找
*@param int a[] 表示查找的庫
*@param int length 表示數組a的長度
*@param int key 表示需要查找的目標對象
*@return  int
*/
int orderSerch(int a[],int length,int key){
	int count = 0;
	if(key >a[length-1]){
	      cout<<"您輸入的元素不存在!"<a[i] ){
			count++;
		    i++;    
		}else if(key == a[i]){
			cout<<"順利查到了,查找成功!"<a[length-1]){
	           cout<<"您輸入的元素不存在!"< key ){
			         high = mid-1;
			  }
		 }
		 if(high == mid&& a[mid] != key ){
			   cout<<"查找次數:"<>input;
	  if(input <0||input >3){
	       cout<<"請重新選擇:"<4){
	        system("CLS");
			operation(a,length);
			count1= 0;
	  }
	  switch(input){
	  case 1:cout<<"進行的是二分查找---"<>key;BinarySerch(a,length,key);cout<<"請選擇是否繼續操作:Y/N"<>c;
		  if(c =='Y'||c=='y'){operation(a,length);}else if(c=='N'||c=='n'){return ;}else{cout<<"輸入選擇有誤!"<>key;orderSerch(a,length,key);cout<<"請選擇是否繼續操作:Y/N"<>c;
		  if(c =='Y'||c=='y'){operation(a,length);}else if(c=='N'||c=='n'){return ;}else{cout<<"輸入選擇有誤!"<>c;
		  if(c =='Y'||c=='y'){operation(a,length);}else if(c=='N'||c=='n'){return ;}else{cout<<"輸入選擇有誤!"<

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved