在线性表的顺序存储结构中用到的查找方式莫过于顺序查找和折半查找;ios
尽管顺序查找的时间复杂度为O(n), 折半查找的时间复杂度为O(log2n),相比之下折半查找就显得效率更高,c++
可是两者使用的场合不一样,须要知足的条件也不一样,因而乎优劣之分便再也不那么重要。数组
首先博主对两者的效率作了一个简单的测试:函数
对已经进行排序后的含有10000的随机数的数组分别进行顺序查找与折半查找,查找的值随机赋予。测试
可结果却不在我意料之中???意料之中后者应该慢一些才对?优化
文中用到的显示函数调用的时间方法:this
cout << "Binary_Search :" << endl;
start = clock(); // 1
BinarySearch(data, search_data, length); //这里进行函数调用
end = clock(); // 2
cout << "Binary_Search spend " << (double)(end - start) / CLOCKS_PER_SEC << "s" << endl << endl; // 3spa
*文中给出了C语言的实现与C++的实现 (见后方源码)code
****************************************************************************************************************************************
blog
一:差别对比分析
1> 折半查找要求查找的数据是有序的,然而顺序查找却对数据没有要求(两者都是顺序存储结构);
2> 若是将两种查找方法对有序数组实施操做:
折半查找能够在比较次数不多的状况下找到数据 (可开头的实验结果说明为何时间还要好久?),
更加适合用于判断某数据是否存在于所查询的场所。
文章开篇的实验结果中查询到的数组下标也直接说明了:
折半查找只是为了快速肯定某数据是否存在(查到的数据不是排序后的该数据的第一个)。
若是想要查询全部的信息,由于数据有序,因此能够在找到第一个数据的时候向左右方向拓展搜索,输出一致的结果。
3> 若是将两种方法对无序数组进行操做:
折半查找此时已再也不试用。
二:源码(基于C语言)
#include
using namespace std;
void Simple_Search(int *array, int search_data, int length)
{
bool Judge = false;
for (int i = 0; i < length; i++)
{
if (array[i] == search_data)
{
cout << "Search_Successful!" << endl;
cout << "array[" << i << "]=" << search_data << endl;
//while (true)
//{
//if (search_data == array[i + 1])
//{
//i++;
//cout << "array[" << i << "]=" << search_data << endl;
//}
//else
//{
cout << endl;
//break;
//}
//}
return;
}
}
if (!Judge)
{
cout << "Cannot find " << search_data << "!" << endl;
}
}
void BinarySearch(int *array, int search_data, int length)
{
int low, mid, high;
low = 0;
high = length - 1;
bool Judge = false;
while (low <= high)
{
mid = (low + high) / 2;
//Anchor:
if (array[mid] == search_data)
{
Judge = true;
cout << "Search_Data_Successful! \narray[" << mid << "]=" << search_data << endl;
//int remember_mid = mid;
//while (true)
//{
//if (search_data == array[mid + 1])
//{
//mid = mid + 1;
//cout << "array[" << mid << "]=" << search_data << endl;
//}
//else
//{
cout << endl;
//break;
//}
//}
//mid = remember_mid;
//while (true)
//{
//if (search_data == array[mid - 1])
//{
//mid = mid - 1;
//cout << "array[" << mid << "]=" << search_data << endl;
//}
//else
//{
cout << endl;
//break;
//}
//}
return;
}
else if (array[mid] < search_data)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
if (!Judge)
{
cout << "Cannot find " << search_data << "!" << endl;
}
}
void Bubble_Sorted(int *array,int length)
{
int temp;
for (int i = length-1; i>0; i--)
{
//bool exchange = false;
for (int j = 0; j < i; j++)
{
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
//exchange = true;
}
}
//if (!exchange) return;
}
}
int main()
{
time_t start, end;
//不加unsigned()的时候:warning C4244: “参数”: 从“time_t”转换到“unsigned int”,可能丢失数据
srand(unsigned(time(NULL)));
int data[10000];
int length = 10000;
int search_data = rand() % 100;
for (int i = 0; i < 10000; i++)
data[i] = rand() % 1000;
Bubble_Sorted(data, length);
for (int i = 0; i < length; i++)
{
if (i % 10 == 0 && i != 0)
cout << endl;
printf("%-5d", data[i]);
}
cout << endl << endl;
cout << "Binary_Search :" << endl;
start = clock();
BinarySearch(data, search_data, length);
end = clock();
cout << "Binary_Search spend " << (double)(end - start) / CLOCKS_PER_SEC << "s" << endl << endl;
cout << "Simple_Search :" << endl;
start = clock();
Simple_Search(data, search_data, length);
end = clock();
cout << "Simple_Search spend " << (double)(end - start) / CLOCKS_PER_SEC << "s" << endl;
return 0;
}
三:源码(基于C++)
1> Search_Simple+Binary.h
#include
#include
#include
#define _CRT_SECCURE_NO_WARNINGS_
class Simple_Search{
private:
int number[50];
public:
void Get_Num();
bool Search_data(int);
void Judge(int);
void Display_number(int);
};
class Binary_Search{
private:
int number_binary[50];
public:
void Sort_Bubble(int length);
void Get_Num_binary();
bool Search_data_binary(int,int);
void Display_number_binary(int);
};
2> Search_Simple+Binary.cpp
#include "Search_Simple+Binary.h"
using namespace std;
void Simple_Search::Get_Num()
{
srand(unsigned(time(NULL)));
for(int i=0;i<50;i++)
{
number[i]=rand()%100;
}
}
bool Simple_Search::Search_data(int search_data)
{
bool ischanged = false;
for(int i=0;i<50;i++)
{
if(search_data == number[i])
{
ischanged = true;
return true;
}
else
{
i++;
}
}
if(!ischanged)
{
return ischanged;
}
return ischanged;
}
void Simple_Search::Judge(int Search_data)
{
cout << "Search_Result:" << endl;
bool result = Simple_Search::Search_data(Search_data);
if(result)
{
cout << "Search " << Search_data << " Successful!" << endl;
}
else
{
cout << "Cannot find this number! (" << Search_data << ")" << endl;
}
}
void Simple_Search::Display_number(int length)
{
cout << "50 Test Data: " << endl;
for(int i=0;i
{
printf("%-4d",number[i]);
if((i+1)%5==0)
cout << endl;
}
}
void Binary_Search::Get_Num_binary()
{
srand(unsigned(time(NULL)));
for(int i=0;i<50;i++)
{
number_binary[i]=rand()%100;
}
}
bool Binary_Search::Search_data_binary(int search_data,int length)
{
cout << "Search_Result:" << endl;
int low,middle,high;
low = 0;
high = length-1;
bool ischanged = false;
while(low<=high)
{
middle = (low+high)/2;
if(number_binary[middle]==search_data)
{
cout << "Search " << search_data << " Successful!" << endl;
ischanged = true;
return ischanged;
}
else if(number_binary[middle]
{
low = middle+1;
}
else
{
high = middle-1;
}
}
if(!ischanged)
{
cout << "Cannot find this number! (" << search_data << ")" << endl;
return ischanged;
}
return ischanged;
}
void Binary_Search::Sort_Bubble(int length) //冒泡优化
{
int temp;
int position = length-1;
int position_temp = length-1;
for(int i =length-1;i>0;i--)
{
bool ischanged = false;
for(int j = 0;j
{
if(number_binary[j]>number_binary[j+1])
{
temp = number_binary[j];
number_binary[j] = number_binary[j+1];
number_binary[j+1] = temp;
ischanged = true;
position_temp = j;
}
}
position = position_temp;
if(!ischanged) return;
}
}
void Binary_Search::Display_number_binary(int length)
{
cout << "50 Test Data: " << endl;
for(int i = 0;i
{
printf("%-4d",number_binary[i]);
if((i+1)%5==0)
cout << endl;
}
}
3> Main_Function.cpp
#include "Search_Simple+Binary.h"
using namespace std;
int main()
{
cout << "Simple_Search:" << endl;
Simple_Search S1;
S1.Get_Num();
S1.Display_number(50);
S1.Judge(8);
cout << "\nBinary_Search:" << endl;
Binary_Search S2;
S2.Get_Num_binary();
S2.Sort_Bubble(50);
S2.Display_number_binary(50);
S2.Search_data_binary(8,50);
return 0;
}
四:在Linux下使用Vim对头文件进行封装
< updating... >