順序查找和二分查找
一、順序查找思想
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<<"輸入選擇有誤!"<