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