查找(依次查找、二分查找、插值查找)

-

  版权声明:本文为博主原创文章,未经博主许可不得转载。 ?https://blog.csdn.net/wangyunyun00/article/details/23464359

  查找定义:依据给定的某个值,在查找表中肯定一个其关键字等于给定值的数据元素(或记录)。

  查找表分类:静态查找表和静态查找表。

  静态查找表:在查找过程当中同时拔出查找表中不存在的数据元素,或许从查找表中删除曾经存在的某个数据元素。

  1. 依次查找

  int Sequential_Search(int *a, int n, int key)

  {

  ? ? ?int i=0;

  ? ? ?for(; i < n; i++)

  ? ? ?{

  ? ? ? ? ? if(a[i]==key)

  ? ? ? ? ? ? ? ?return i;

  ? ? ?}

  ? ? ?return 0;

  }

  ?

  int Sequential_Search2(int *a, int n, int key)

  {

  ? ? ?int i;

  ? ? ?a[0]=key;

  ? ? ?for(i=n; a[i] !=a[0]; i--);

  ? ? ?return i;

  }

  平均查找长度(Average Search Length,ASL)

  ?需和指定key停止比拟的关键字的个数的希冀值,成为查找算法在查找胜利时的平均查找长度。

  ?关于含有n个数据元素的查找表,查找胜利的平均查找长度为:ASL=Pi*Ci的和。

  ?Pi:查找表中第i个数据元素的概率。

  ?Ci:找到第i个数据元素时曾经比拟过的次数。

  ?依次查找 查找胜利时的平均查找长度为:

  ?(假定每个数据元素的概率相等) ASL=1/n(1+2+3+…+n)=(n+1)/2 ;

  ?当查找不胜利时,需求n+1次比拟,时间复杂度为O(n);

  2. 有序表查找

  2.1 折半查找

  条件:线性表中的记录必须是关键字有序(平日从小到大年夜),线性表必须采取依次存储。

  基本思维:取中间记录作为比拟对象,若给定值与中间记录的关键字相等,则查找胜利;若给定值小于中间记录的关键字,则在中间记录左半区继续查找;否则,在右半区查找。不时重复,知道查找胜利或许查找掉败为止。

  int Binary_Search(int *a, int n, int key)

  {

  ? ? ?int low, high;

  ? ? ?int mid;

  ? ? ?low=1;

  ? ? ?high=n;

  ?

  ? ? ?while(low < high) ? ? ?//可以有等号 low <=high ,不影响辨别。

  ? ? ?{

  ? ? ? ? ? mid=(low + high) / 2; ?//可以修改成 mid=(low + high) >> 1;

  ? ? ? ? ? if(a[mid]==key)

  ? ? ? ? ? ? ? ?return mid;

  ? ? ? ? ? if(a[mid] > key)

  ? ? ? ? ? ? ? ?high=mid - 1;

  ? ? ? ? ? if(a[mid] < key)

  ? ? ? ? ? ? ? ?low=mid + 1; ? ?//关于if else语句,可以思考条件表达式,增加代码的行数。

猜你喜欢