对随机数进行顺序查找C语言,C/C++ 折半查找与顺序查找【对比分析】

在线性表的顺序存储结构中用到的查找方式莫过于顺序查找和折半查找;ios

尽管顺序查找的时间复杂度为O(n), 折半查找的时间复杂度为O(log2n),相比之下折半查找就显得效率更高,c++

可是两者使用的场合不一样,须要知足的条件也不一样,因而乎优劣之分便再也不那么重要。数组

首先博主对两者的效率作了一个简单的测试:函数

对已经进行排序后的含有10000的随机数的数组分别进行顺序查找与折半查找,查找的值随机赋予。测试

可结果却不在我意料之中???意料之中后者应该慢一些才对?优化

a98328b87f4c48d3b44670f231eaa59a.gif

文中用到的显示函数调用的时间方法: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... >

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值