查找(一)静态查找的顺序查找和 有序折半查找

数据的静态查找:顺序表查找和 有序表的折半查找

顺序查找: 将数据与待查找的元素相比较,如果找到相同的元素,就表示查找成功,否则查找失败。值得注意的是,在程序中设置了一个哨兵项,位于数组的第0个合肥位置,这样做的好处是可以更方便的判断什么时候循环应该终止,减小循环中的比较次数,对提高效率有很大帮助。


有序表的折半查找:要先将数组的顺序排成有序的,比如说非降序的,然后再用折半查找法。折半查找的效率比有序查找高,但折半查找只适用于有序表,且限于顺序存储结构(对线性链表无法有效地进行折半查找)。


#include<stdio.h>
#include<stdlib.h>




//顺序表的查找
int Search_Seq(int ST[],int key,int n)
{
 int i=0;
 while( ST[i]!=key && i<n)
	 i++;
	 return i;
 return -1;
}

//顺序表的查找
int Search_Seq1(int ST[],int key,int n)
{
   int i,j;
   int * arra = (int *)calloc(n+1,sizeof(int));//将原始数组装入一个新的数组中,该数组首字符为空,为哨兵使用
   for(i=1;i<=n;i++)
	   *(arra+i) = ST[i-1];
   
   arra[0] = key;
   
   for(j=n; arra[j] != key; --j);
	   return j-1;//这里面的第j个相当于原数组里j-1个
}

//对数组ST进行排序
void sort_accend(int ST[],int len)
{ 
  int i,j,index,min,temp;
  
  for(i=0;i<len;i++)
  { 
	min = ST[i];
    for(j=i;j<len;j++)
	    if(ST[j]<min)
		{ 
			min = ST[j];
            index = j;
		}
	temp = ST[i];
	ST[i] = ST[index];
	ST[index] = temp;
  }
  //for(int k=0;k<len;k++)
  //  printf("%d\n",ST[k]);

}


//有序表的查找,折半查找
int Search_Bin(int ST[],int key,int len)
{
   int low = 0;
   int high = len -1;
   int mid;

   while(low<=high)
   {
     mid = (low+high)/2;
	 if( key < ST[mid] )  
		 high = mid - 1; 
	 else if( key > ST[mid] )  
         low = mid + 1;
	 else
		 return mid;
   }
   return -1;

}





int main()
{   int n = 8;
	int ST[8] = {49,38,65,97,76,13,27,49};
	int key;
	int result;
	printf("顺序表的查找,输入要查找的元素:\n");
	scanf("%d",&key);

	result = Search_Seq1(ST,key,n);
	if( result!=-1)
		printf("顺序查找成功,是第 %d 个元素\n",result);
	else
		printf("顺序查找不成功\n");

	sort_accend(ST,n);//静态有序折半法查找,要先排序
	for(int k=0;k<n;k++)
    printf("%d\n",ST[k]);
	printf("有序折半的查找,输入要查找的元素:\n");
	scanf("%d",&key);
	result = Search_Bin(ST,key,n);
	if(result!=-1)
		printf("有序折半查找成功,是第%d个元素\n",result);
	else
		printf("有序折半查找不成功");
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值