折半查找
算法思想:
将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。
折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素必须有序。
算法步骤描述:
step1 首先确定整个查找区间的中间位置
mid = ( left + right )/ 2
step2 用待查关键字值与中间位置的关键字值进行比较;
若相等,则查找成功
若大于,则在后(右)半个区域继续进行折半查找
若小于,则在前(左)半个区域继续进行折半查找
Step3 对确定的缩小区域再按折半公式,重复上述步骤。最后,得到结果:要么查找成功, 要么查找失败。
折半查找的存储结构采用一维数组存放。
折半查找算法举例
对给定数列(有序){
3,5,11,17,21,23,28,30,32,50},按折半查找算法,查找关键字值为30的数据元素。
折半查找的算法讨论:
优点: ASL≤log2n,即每经过一次比较,查找范围就缩小一半。经log2n 次计较就可以完成查找过程。
缺点:因要求有序,所以要求查找数列必须有序,而对所有数据元素按大小排序是非常费时的操作。另外,顺序存储结构的插入、删除操作不便利。
#include
usingnamespacestd;
intFind_Half_Line(intlow,inthigh,intFind_Name,inta[])
...{
while(low<=high)
...{
intmid=(low+high)/2;
if(a[mid]==Find_Name)//如果相等则返回
returnmid;
else
if(Find_Name>a[mid])//大于查找值最低的值变为折半中间的值
low=mid+1;
elsehigh=mid-1;//小于最大值变为中间值
}
return-1;
}
intmain()
...{
intFind_Name;
intlow=0,high=9;
inta[10]=...{2,3,5,8,10,12,15,17,19,20};
cin>>Find_Name;
cout<
return0;
}
插入排序
插入排序(Insertion
Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
//直接插入排序
#include
usingnamespacestd;
voidInsert_Line(inta[10])
...{
for(inti=2;i<=10;i++)
...{
intj=i-1;
a[0]=a[i];//付给0 设置哨点
while(a[0]
...{
a[j+1]=a[j];//元素后移
a[j]=a[0];
j--;
}
}
}
intmain()
...{
inta[11];
cout<
for(inti=1;i<=10;i++)//输入
...{
cin>>a[i];
}
Insert_Line(a);
//输出
for(i=1;i<=10;i++)
...{
cout<