C语言排序与查找实例

 

1、顺序查找

学号姓名成绩
1001ANN93
1002LILY95
1003LUCY98
1004TOM100

编写一上程序,要求输出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)中的合适的位置,使得插入后的序列仍然保持按值有序

 


 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值