将无序数组排列+二分法

本文介绍了如何在C语言中使用二分查找算法在已排序数组中搜索特定元素,并展示了如何对数组进行排序。通过代码示例详细讲解了max函数和二分法的运用。
摘要由CSDN通过智能技术生成

因为期末考,放空了好多知识,发烧刚好马上来上货咯!

#include<stdio.h>

//开始进入搜索步骤 
int search(int key,int a[],int len)
{
    //作为标记判断是否存在key 
    int ret = -1;
    //定义左右位置的下标 
    int right = 0 ;
    int left = len-1 ;
    
    //通过循环判断 
    while(right<=left)
    {
        
        //中间值由左右除二可得,并且每次都要更新,所以放入循环当中 
        int mid = (right+left)/2;

        
        //开始判断 key 与 a[mid] 的关系 
        if(a[mid]==key)
        {
            ret = mid;
            break;
        }
        else if (a[mid]>key)
        {
            left=mid-1;
        }
        else
        {
            right = mid+1; 
        }
    }

    //最终返回标记 
    return ret;
}

//寻出最大值 
int max(int a[],int len)
{
    
    //假设: a[0]为最大值,并与 a[i]比较,不断变化 
    int maxid = 0;
    
    //用来遍历整个数组,并小于len 
    int i=0;
    
    //用for循环实现 
    for(i=1;i<len;i++)
    {
        if (a[i]>a[maxid])
        {
            maxid = i;
        }
    }
    
    //返回最大值下标 
    return maxid;
 } 

int main ()
{
    //随机定义数据 
    int a[]={25,26,12,1,3,8,90,15,16,17,}; 
    
    //数组长度 
    int len = sizeof(a)/sizeof(a[0]);
    
    //int maxid = max(a,len);
    //打印最大值,检查是否正确 
    //printf("%d\n",a[maxid]);

    
    //排列有序数组

    int i = 0;
    
    //交换 a[maxid] 与 a[len-1] 
    for (i=len-1;i>0;i--)
    {
        
    //寻出最大值 (i+1=len)
    int maxid = max(a,i+1);
    
    //开始交换,并有序排列 
    int swap = a[maxid];
    a[maxid]= a[i];
    a[i]=swap;
    }
    
    //通过循环把有序数组打印出来 
    for(i=0;i<len;i++)
    {
        printf(" %d ",a[i]);
    
    }
        printf("\n");

    //二分法应用
    
    //key为要搜索的数字 
    int key =12;
    
    //开始进入搜索步骤 
    int ret = search(key,a,len); 
    
    //由标记来输出下标或判断是否存在 
    if(ret!= -1)
    {
        printf("下标为 %d\n",ret);
    }
    else 
    {
        printf("该数字不存在该数组");
    }
        
    return 0;
    
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值