考研路_数据结构_查找1_顺序查找和二分查找

来源:互联网 发布:淘宝老板 编辑:程序博客网 时间:2024/04/30 11:33

数据结构常用查找算法_顺序查找

顺序查找:在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。

C语言实现:

int Linear_Search1(int *a, int n, int key) {//从序列表中查找为key的关键值,成功则返回其下标值,否则查找失败,返回-1int i;for(i==1; i<=n; i++) {if(a[i] == key) {return i;}}return 0;}


上述顺序查找代码中,并未最优化的,因为每次循环时都需要对i,进行越界判断(;i<=n;),为避免重复判断,可用哨兵法。代码如下:

int Linear_Search2(int *a, int n, int key) {int i;a[0] = key;          /*将关键值key赋值给a[0],即设置“哨兵”*/i = n;while(a[i] != key) {i--;}return i;            /*返回0则说明未找到关键值key*/}

Linear_Search2代码详解:

该段代码从尾部n开始查找,将a[0]赋值为key,若在查找过程中,成功找到key值,则返回其下标i,若无法找到,则i的值等于0。

“哨兵”法:在查找前设置哨兵,可避免查找过程的每次的溢出判断,在总数据较多时有效的改善了Linear_Search1的方法。

java语言实现:

public class LinearSearch {public int getIndex(int[] arr, int key) {int i;for(i=0; i<arr.length; i++) {if(arr[i] == key)return i;}return -1;}}

这是个迭代过程,从数组下标为0到数组下标最大值,若找到给定关键值,则返回该值在数组中的位置,否则查找失败,时间复杂度为O(n)。

数据结构常用查找算法_二分查找

二分查找又称折半查找:每次选取剩下一半的中间进行查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

C语言实现:

int Binary_Search(int *a, int n, int key) {int low = 0;                        /*设置下区间*/int high = n;                       /*设置上区间*/if(a[low] == key)                   /*判断是否为上下端点*/return low;if(a[high] == key)return high;while(low <= high){int mid = low + (high - low)/2; /*避免((low+high)/2)中(low+high)的结果溢出,即值大于数据类型所能表达的最大值*/if(a[mid] == key)               /*查找到关键值并返回其下标值*/return mid;else if(a[mid] < key) low = mid + 1;              /*中间值比关键值小,则把中间值加1赋值给下一轮的下区间*/else high = mid - 1;             /*中间值比关键值大,则把中间值减1赋值给下一轮的上区间*/}}

java语言实现:

public class BinarySearch {public int getIndex(int[] arr, int key) {int low = 0;            //下区间int high = arr.length-1;//上区间while(low <= high) {    int mid = (low + high)/2;if(arr[mid] == key) {return mid;     //查找成功,返回关键值在数组中的位置}else if(arr[mid] < key) {low = mid + 1;  //中间值比关键值小,则把中间值加1赋值给下一轮的下区间}else {high = mid - 1; //中间值比关键值大,则把中间值减1赋值给下一轮的上区间}}return -1;              //查找失败}}

二分查找过程,时间复杂度为O(logn)。

原创粉丝点击