1、顺序查找
学号 | 姓名 | 成绩 |
1001 | ANN | 93 |
1002 | LILY | 95 |
1003 | LUCY | 98 |
1004 | TOM | 100 |
编写一上程序,要求输出1001编号同学的具体信息
#include "stdio.h"
typedef struct student{
int id;//学生编号
char name[100];//学生姓名
float score ;//成绩
}Student;
int search(Student stu[] , int n, int key)
{
int i;
for(i = 0 ; i<n ; i++)
if(stu[i].id ==key)
return i;//查询成功
return -1;//查询失败
}
void main()
{
Student stu[]={{1004, "TOM",100},
{1002 , "LILY",95},
{1001 , "ANN" , 93},
{1003, "LUCYr", 98}
};//初组化数组
int addr;//要查找的记录的地址
addr = search(stu ,4 , 1001);
printf("Student ID : %d\n", stu[addr].id);//输出查询找到的记录数据
printf("Student name :%s\n",stu[addr].name);
printf("Student score :%f\n",stu[addr].score);
}
运结果
2、半折查找
折半查找基本思想是:减小查找序列的长度,分而治之地进行关键字的查找。它的查找过程是:先确定待查找记录的所在的范围,然一逐渐缩小查找的范围,直至找到该记录为止(也可能查找失败)。例如文件记录的关键字序列为:
(1,3,5,6,9,12,13,17,21,28,30)
该序列包含11个元素,而且关键字单调递增。现在想查找关键字key为28的记录。如果应用顺序查找法进行,需要将28之前的所有关键字与key比较,共需比较10次。如果用折半查找方法可以这样帮
设指针low和high分别指向关键字序列的上界下界,即low = 0, high= 10.指针mid指向序列的中间位置,即mid=(low+high)/2=5.在这里low指向关键字1,high指向关键字30,mid指向关键字12.
(1)、首先将mid所指向的元素与key进行比较,因为key = 28,大于12,这就说明待查找的关键字一定位于mid之于mid与之间。这是因为原关键字序列是有递增的。因些下面的查找工作只需在[mid +1, high ]中进行。于是令指针low指向mid+1 的位置,即low =6 , 也就是指向关键字13,并将mid调整到指向关键字21,即mid = 8.
(2)、然后再将mid所指的元素key比较,因为key =28,大于21,说明待查找的关键字一定位于mid和之high之间。所以下面的查找工作仍然只需在[mid+1,high]中进行。于是令指针low指mid+! 的位置,即low =9 .high保持不变。
(3)、按下来仍然将mid所指的元素与key进行比较,比较相等,查找成功,返回mid的值9。
算法如下:
int searce(keytype key[] ,int n , keytype k)
{
int low =0, high = n-1 , mid;
while(low <= high)
{
mid =(low + high)/2 ;
if(key [mid]==k)
return mid;//查询成功,返回mid
if(k>key[mid])
low = mid +1;//在后半序列中查找
else
high = mid -1//在前半序列中查找
}
return -1;//查找失败,返回-1
}
实例讲解
有一个数组A[10],里面存放了10个整数,顺序递增
A[10]={2,3,5,7,8,10,12,15,19,21}
任意输入一个用数字n用折半查找法找到n位于数组中的位置。如果n 属于数组A,显示错误提示.
#include "stdio.h"
bin_search(int A[],int n,int key){
int low,high,mid;
low = 0;
high = n-1;
while(low<=high)
{
mid = (low + high)/2;
if(A[mid]==key)return mid; /*查找成功,返回mid*/
if(A[mid]<key){
low = mid + 1; /*在后半序列中查找*/
}
if(A[mid]>key){
high = mid - 1; /*在前半序列中查找*/
}
}
return -1; /*查找失败,返回-1*/
}
main()
{
int A[10] = {2,3,5,7,8,10,12,15,19,21},i,n ,addr;
printf("The contents of the Array A[10] are\n");
for(i=0;i<10;i++)
printf("%d ",A[i]); /*显示数组A中的内容*/
printf("\nPlease input a interger for search\n");
scanf("%d",&n); /*输入待查找的元素*/
addr = bin_search(A,10,n); /*折半查找,返回该元素在数组中的下标*/
if(-1 != addr) /*查找成功*/
printf("%d is at the %dth unit is array A\n ",n,addr);
else printf("There is no %d in array A\n",n); /*查找失败*/
}
运行结果:
3、直接插入排序
直接插入排序的基本思想是:第i趟排序列中的第i+1个元素Ki+1插入到一个已经按值有序的子序列(K1,K2 , K3....ki)中的合适的位置,使得插入后的序列仍然保持按值有序