//【1】.冒泡
for(int i=1;i<N;i++) //下标从1开始
{
for(int j=1;j<=N-i;j++)
{
if(a[j]>a[j+1])
{
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
//【2】.选择排序
for(int i=0;i<100;i++) //下标从0开始
{
k=i;
for(int j=i+1;j<100;j++)
if(a[j]<a[k])
k=j;
if(k!=i)
{
int t=a[k];
a[k]=a[i];
a[i]=t;
}
}
//【3】.插入排序
//1.普通方法
for(int i=2;i<N;i++) //下标从1开始
{
if(a[i]<a[i-1])
{
a[0]=a[i];
a[i]=a[i-1];
int j;
for(j=i-2;a[0]<a[j];j--)
a[j+1]=a[j];
a[j+1]=a[0];
}
}
//2.二分优化
for(int i=2;i<N;i++) //下标从1开始
{
a[0]=a[i];
int l=1,r=i-1,m,j;
while(l<=r)
{
m=(l+r)/2;
if(a[0]<a[m])
r=m-1;
else
l=m+1;
}
for(j=i-1;j>=r+1;j--)
a[j+1]=a[j];
a[j+1]=a[0];
}
//【4】.顺序查找
int sxcz(int a[],int key) //顺序查找,形参为要查找的值key
{
int i;
a[0]=key; //把哨兵a[0]赋值为要查找的值:key
for(i=N;a[i]!=key;i--);
return i; //返回key所在数组的下标,0代表未找到
}
//【5】.二分查找
int efcz(int a[],int key) //二分查找,形参为要查找的值key
{
int low=1,high=N,mid; //定义待查找区间的上界high,下界low,中间位置mid
while(low<=high) //循环直到越界(low>high)停止
{
mid=(low+high)/2; //取中间位置mid:mid=(low+high)/2
if(a[mid]==key) //若相等,则查找成功
break; //退出循环
else if(a[mid]>key) //若大于,待查记录在区间的前半段
high=mid-1; //修改上界指针:high=mid-1
else //若小于,待查记录在区间的后半段
low=mid+1; //修改下界指针:low=mid+1
}
if(low<=high) //若low<=high,代表查找成功
return mid; //返回位置mid
else
return 0; //查找失败返回0
}
简单排序模板
最新推荐文章于 2023-06-01 16:55:13 发布