今天这篇,我们来说一下数据结构最后一个内容:查找排序算法
**
七、查找排序算法
**
排序查找某些数据使我们在程序中经常使用的,本文介绍几种常用的查找排序算法以供大家参考,不喜勿喷。
1.折半查找
折半查找要求数据必须是有序的,即,顺序结构,有序排列(从小到大或者从大到小),这个很好理解,我们直接上代码:
#include "stdio.h"
int half_find(int *a,int n)
{
int i;
int mid,low,high;
low=0;
high=9;
for(i=0;i<10;i++)
{
mid = (low+high)/2;
if(a[mid] == n)
{
return mid+1; //返回数据数据的下标+1
}
if(a[mid]>n) //如果要查找的数据比中间那个数据大
{
high = mid-1;
}
if(a[mid]<n) //如果要查找的数据比中间那个数据小
{
low = mid+1;
}
}
return 0;
}
int main(int argc, char const *argv[])
{
int a[10];
int i,n;
printf("请输入十个整数:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("请输入你要查找的数字:\n");
scanf("%d",&n);
int k;
k = half_find(a,n);
if(k == 0)
{
printf("要查询的数据不存在\n");
}
else
{
printf("要查找的数字 %d 在第 %d 个\n",n,k);
}
return 0;
}
运行结果:
代码的思路很简单,如下图:
结合程序一起,理解起来就很简单了。
注意适用折半查找的场合:顺序结构、有序排列。
2.折半插入排序
已知一组有序排列的数组,现在有一个新的数据需要按照原来数组的排列方式插入这个数组,那么我们就可以适用折半插入排序,和上面方法一样,我们直接上代码:
#include <stdio.h>
void display(int *a)
{
int i;
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
int a[10]={19,25,45,12,34,67,70,60,89,80};
int i,j;
int low,mid,high,temp;
for(i=1;i<10;i++)
{
low=0;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if (a[mid]>a[i])
{
high=mid-1;
}
if (a[mid]<a[i])
{
low=mid+1;
}
}
temp=a[i];
for(j=i-1;j>=low;j--)
{
a[j+1]=a[j];
}
a[low]=temp;
display(a);
}
return 0;
}
和上面折半查找的思路方法完全一致,这里就不做过多的赘述。
3.直接插入排序
这个方法思路如下图所示:
#include "stdio.h"
void insert(int *a)
{
int i;
int k,temp;
for(i=1;i<10;i++)
{
if(a[i]<a[i-1])
{
temp=a[i];
k=i-1;
while(temp<a[k]&&k>=0)
{
a[k+1]=a[k];
k--;
}
a[k+1]=temp;
}
}
}
int main(int argc, char const *argv[])
{
int a[10];
int i;
printf("请输入10个整数:\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
insert(a);
for(i=0;i<10;i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
运行结果:
4.选择排序和冒泡排序
作为非常经典的两种排序算法,请务必掌握
请参考我之前写的一篇博文:
选择排序和冒泡排序