C/C++ 折半查找与顺序查找【对比分析】
在线性表的顺序存储结构中用到的查找方式莫过于顺序查找和折半查找;
尽管顺序查找的时间复杂度为O(n), 折半查找的时间复杂度为O(log2n),相比之下折半查找就显得效率更高,
但是二者使用的场合不同,需要满足的条件也不同,于是乎优劣之分便不再那么重要。
首先博主对二者的效率做了一个简单的测试:
对已经进行排序后的含有10000的随机数的数组分别进行顺序查找与折半查找,查找的值随机赋予。
可结果却不在我意料之中???意料之中后者应该慢一些才对?
文中用到的显示函数调用的时间方法:
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; // 3
*文中给出了C语言的实现与C++的实现 (见后方源码)
****************************************************************************************************************************************
一:差异对比分析
1> 折半查找要求查找的数据是有序的,然而顺序查找却对数据没有要求(二者都是顺序存储结构);
2> 如果将两种查找方法对有序数组实施操作:
折半查找可以在比较次数很少的情况下找到数据 (可开头的实验结果说明为什么时间还要很久?),
更加适合用于判断某数据是否存在于所查询的场所。
文章开篇的实验结果中查询到的数组下标也直接说明了:
折半查找只是为了快速确定某数据是否存在(查到的数据不是排序后的该数据的第一个)。
如果想要查询所有的信息,因为数据有序,所以可以在找到第一个数据的时候向左右方向拓展搜索,输出一致的结果。
3> 如果将两种方法对无序数组进行操作:
折半查找此时已不再试用。
二:源码(基于C语言)
#include <bits/stdc++.h>
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 <iostream>
#include <string>
#include <time.h>
#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<length;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]<search_data){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<position;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<length;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... >
C/C++ 折半查找与顺序查找【对比分析】相关推荐
- 查找算法:二分查找、顺序查找
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...
- C语言丨线性查找(顺序查找)
程序员在程序设计时常常需要对存储在数组中的大量数据进行处理,如排序.查找等.使用数据库时,用户可能需要频繁通过输入键字值来查找相应的记录.在数组中搜索一个特定元素的处理过程,称为查找.这次我们来介绍一 ...
- 数据结构—查找(顺序查找和折半查找)
1.顺序查找的查找表的数据结构 typedef struct{Elemtype *elem;int TableLen; //表的长度 }SeqList; 2.顺序查找的主要代码 //一般线性表的顺序查 ...
- 数据结构——线性表的查找:顺序查找、设置监视哨的顺序查找、折半查找
算法7.1顺序查找 #include<iostream> using namespace std;typedef int KeyType; typedef int InfoType; #d ...
- 数据结构与算法笔记(十二)—— 查找算法(顺序查找、二分法查找)
搜索是在一个项目集合中找到一个特定项目的算法过程.搜索通常的答案是真的或假的,因为该项目是否存在.搜索的几种常见方法:顺序查找.二分法查找.二叉树查找.哈希查找 一.顺序查找 最基本的查找技术,过程: ...
- 查找(顺序查找、二分查找、插值查找)
查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删 ...
- php顺序查找法,php二分查找、顺序查找算法
摘要:php查找数组元素有内置的函数array_search和in_array,顺序查找对数组排序没有要求,二分查找法要求数组必须是一个有序数组!1.顺序查找function sequence_sea ...
- 查找:顺序查找、二分查找、分块查找
一.顺序查找 按索引顺序查找,可用于查找无序序列 int SequenceSearch(vector<int> seq, int key) {const int c_len = seq.s ...
- 查找算法——顺序查找
目录 一.算法介绍 1.算法思想 2.算法流程 二.算法实现 1.代码实现 2.测试用例及结果 三.效率分析 1.时间复杂度 2.空间复杂度 一.算法介绍 1.算法思想 顺序查找也称线性查找,其查 ...
最新文章
- php实现 明明的随机数
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩
- Android Studio配置GreenDAO 3.2.0和使用方法
- Extjs4.1 vtype验证
- ElasticJob corn定时表达式语法(亲测)
- 牛客网【每日一题】4月16日题目精讲 逆序对
- 浙江计算机二级报名步骤,浙江2016年9月计算机二级考生报名流程
- Android 获取短信验证码,自动填充
- STL源码剖析 slist单向链表概述
- Java8中list转map方法总结
- 下载文件根据浏览器判断文件名,解决兼容性问题
- linux上启动git,linux上git操作与打jar包更新启动服务脚本
- thymeleaf教程
- [原创]java导出excel
- Atitit.软件与编程语言中的锁机制原理attilax总结
- 22种手机使用中的常见问题及处理方法
- restful什么意思_RESTful的真正含义是什么?
- [Opencv]Cascade级联分类器
- idea import javafx.util.Pair 异常原因
- 安科瑞能耗系统在智能配电网下中小型企业(江阴市康乾车业有限公司)的设计和应用
热门文章
- 电脑如何查看及开启虚拟化
- android驱动例子(led灯控制),android驱动例子(LED灯控制)
- Django基础五之Django模型层(二)多表操作
- C++实现Kingdomrush小游戏
- 课程设计项目——网上商城
- 温度上报实时监控项目——客户端
- 【阿旭机器学习实战】【15】人脸自动补全(多目标回归),并比较5种不同模型的预测效果
- p1000_超级玛丽游戏
- ipadpro分屏怎么操作_iPad到手后必备的高效设置技巧(iPad Pro、iPad Air、iPad mini学习生产工具...
- GO笔记之为什么要学习GO