×

二分法排序c语言

二分法排序c语言(C语言中二分法的具体程序是什么呢)

admin admin 发表于2022-12-25 12:19:06 浏览42 评论0

抢沙发发表评论

本文目录

C语言中二分法的具体程序是什么呢


举个例子:
//二分查找法//
#
include
void
main()
{
int
a,i,num,flag=0,top,bottom,mid;
//定义一个一维数组a用来存放供查找用的数据,但只用a——a//
//num用来放要查找的数据,flag是表示是否找到的开关变量,top表示查找的起始位置,bottom表示查找的终止位置,mid表示top与bottom的中间位置//
char
goon;
//变量goon为’y’或’Y’时表示继续下一轮查找,否则终止程序//
printf(“请输入第1个数字:\n“);
scanf(“
%d“,&a);
//依次输入第二到第十五个数,并要求输入的数递减//
for(i=2;i《=15;i++)
{
printf(“请输入第%d个数字:\n“,i);
scanf(“
%d“,&a[i]);
if(a[i]》=a[i-1])
{
printf(“请再次输入,它应该比上一个数小:\n“);
scanf(“
%d“,&a[i]);
}
}
//输出刚才输入的数//
printf(“你刚才输入的数是:\n“);
for(i=1;i《=15;i++)
printf(“
%d“,a[i]);
printf(“\n“);
//查找循环开始//
do
{
printf(“现在请输入你要查找的数:\n“);//输入想要查找的数//
scanf(“
%d“,#);
top=15;
bottom=1;
mid=15/2+1;
if(num》a
||
num
0)//如果在规定的范围内,开始二分法查找//
{
if(num==a[mid])//找到所需数据,退出本层循环//
{
printf(“你所要查找的数字是第%d个。\n“,mid);
flag=1;
}
else
if(num》a[mid])//如果要查找的数据比a[mid]大,在前半数组查找//
{
top=mid+1;
mid=(top+bottom)/2;
}
else
//如果要查找的数据比a[mid]小,在后半数组查找//
{
bottom=mid-1;
mid=(top+bottom)/2;
}
}
if(flag==0)//如果未找到数据,输出找不到的信息//
printf(“无法找到你要找的数字!\n“);
printf(“是否继续查找?(Y/N):\n“);//询问是否开始下一轮查找//
scanf(“
%c“,&goon);
}while(goon==’y’
||
goon==’Y’);
}

C语言 怎么用二分法在字母数组{’a’,’b’,’g’,’w’}中查找’h’


二分法应用于有序排列的数组,所以我测试数据,先写了字母排序函数,再对排序后的字母数组进行二分法查找’h’。你参考吧。

#include 《stdio.h》
#include 《string.h》
void px(char *str);//将字母数组升序排列
int main()
{
    char str=“abctuvwxyzijkldefghrsmnopq“;
    int i,count=0,mini=0,len=strlen(str),maxi=len-1,midi=(maxi-mini)/2;
    px(str);
    printf(“排序后的字母数组为:%s\n“,str);
    while(1)//通过2分法找到字母‘h’的数组下标
    {
        if(’h’《str[midi])
        {
            maxi=midi;
            midi=(maxi-mini)/2+mini;
        }
        if(’h’》str[midi])
        {
            mini=midi;
            midi=(maxi-mini)/2+mini;
        }
        if(’h’==str[midi])
        {
            i=midi;
            break;
        }
        if(’h’==str[maxi])
        {
            i=maxi;
            break;
        }
        if(’h’==str[mini])
        {
            i=mini;
            break;
        }
        count++;
    }
    printf(“通过二分法查找,字母%c在数组的下标为:%d,共迭代次数%d次\n“,str[i],i,count);
    return 0;
}
void px(char *str)//将字母数组升序排列
{
    int i,j;
    char c;
    for(i=0;i《strlen(str);i++)
    {
        for(j=i+1;j《strlen(str);j++)
        {
            if(str[i]》str[j])
            {
                c=str[i];
                str[i]=str[j];
                str[j]=c;
            }
        }
    }
}

c语言中的二分法查找是什么


是一种数据处理的算法。常用与排序。
例如
int
a,b=4,calc;
int
sum={1,2,3,4,5,6,7,8,9};
//这样一个数组
scanf(a);
for(calc=0;calc《9;calc++)
{
if(a《sum[b])
{
b=b/2;
if(a《sum[b])
{
printf(“这个数按照升序排序位置是在“
,
b+1);
}
}else
{
b=b*2;
if(a《sum[b])
{
printf(“这个数按照升序排序位置是在“,b+1);
};
};
};
取一段数的中间数,来与已知的数来比较。来确定在数的前方还是后方,再重复以上比较。最后确定在一列排序完成的数集合中的位置。
【写的存在问题。】因为在考试,时间有限。

C语言二分法插入已排序的数组中


#include《stdlib.h》
void sort(int a,int n){ /*排序函数,要使用二分法查找就必须对数组进行排序*/
int i,k;
for(i=0;i《n;i++){
int min=i;
for(k=i+1;k《n;k++)
if(a[min]》a[k])min=k;
if(i!=min){
a[min]+=a[i];/*这里是运用加减法交换两个数*/
a[i]=a[min]-a[i];
a[min]-=a[i];
}
}
}int find(int a,int n,int key){/*二分法查找;参数:数组名,数组长度,查找关键字*/
int min=0,max=n-1;/*二分法查找头尾变量*/
while(min《max){/*如果最头的变量值大于最尾变量的值,则查找不到,查找失败*/
int cen = (min+max)/2;
if(a[cen]==key) return cen;/*如果查到,则返回关键字在排序数组的下标*/
if(cen==min || cen==max)break;/*如果中间变量等于头尾任一个变量,同样查找失败*/ if(a[cen]》key) max=cen;
else min=cen; }
return -1;
}
void main(){/*主程序只是为了证明两个函数的可行性,可以自己编写*/
int a={14,10,25,36,87,95,10,12,13,8},i;
sort(a,10);
i=find(a,10,11);
if(i!=-1)
printf(“be found“);
else
printf(“no found“);
getch();
}

c语言如何实现-数组排序,二分查找


给定已经排好序的n个元素,现在要在这n个元素中找出一特定元素x。顺序搜索的方法是逐个比较,直至找出元素。二分搜索则利用了元素间的次序关系,可大大提高效率。二分法的基本思想是将n个元素分成个数大致相同的两半,取a[n/2]与x作比较。如果x==a[n/2],则终止。如果x《a[n/2],则只需在数组的左半部分继续搜索。如果x》a[n/2],则只需在右半部分搜索。本题要求利用上一题得到的数组进行顺序查找和二分查找,分别为两种查找方法计时。
#include《stdio.h》
#include《stdlib.h》
#include《time.h》
void xuanzhe(int a, int n)
{
int i, j, min, t;
for (i=0; i《n-1; i++) /*要选择的次数:0~n-2共n-1次*/
{
min = i; /*假设当前下标为i的数最小,比较后再调整*/
for (j=i+1; j《n; j++)/*循环找出最小的数的下标是哪个*/
{
if (a[j] 《 a[min])
{
min = j; /*如果后面的数比前面的小,则记下它的下标*/
}
}
if (min != i) /*如果min在循环中改变了,就需要交换数据*/
{
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
}
int main(){
int i,n,x;
int mid,left=0,right=999;
int find1=0,find2=0;
double y;
int a;
for(i=0;i《1000;++i){
a[i]=rand();
}
xuanzhe(a,1000);
scanf(“%d“,&x);
printf(“顺序查找:\n“);
for(i=0;i《1000;++i){
while(x==a[i]){
printf(“找到X=%d,a[%d]\n“,x,i);
find1=1;
break;
}
}
if(find1==0){
printf(“没有你要找的数\n“);
}
printf(“%fs\n“,clock()/CLOCKS_PER_SEC);
y=clock();
printf(“二分查找:\n“);
while(!find2&&left《right)
{
mid=(left+right)/2;
if(x==a[mid])
find2=1;
else if(x《a[mid])
right=mid-1;
else left=mid+1;
}
if(find2==1)
printf(“找到x=%d ,a[%d]\n“,x,mid);
else
printf(“没有你要找的数\n“);
printf(“%fs\n“,(clock()-y)/CLOCKS_PER_SEC);
}

顺序表的排序,二分法查找的c语言程序


#include《stdio.h》
int fun(int a,int n,int key)
{i
nt low,mid,high;//low、mid、high是三个索引分别指向数组的下标low=0;//low指向数组a的第一个元素,即下表为0的元素
high=n-1;//lhigh指向数组a的最一个元素,即下表为n-1的元素,n为数组的长度
while(low《=high)//循环终止条件是low》high的时候
{
mid=(low+high)/2;//所谓二分查找就在这里,每次都让mid指向数组下标等于low和high之和的一半的元素i
f(key《a[mid])//如果a【mid】大于要查找的元素,说明要查找的元素在low和mid之间,这是需要把high重新置为mid-1
(high=mid-1);//这里应该是{},不能使()吧
else if(key》a[mid])//这里同理,如果a【mid】小于要查找的元素,说明要查找的元素在mid和high之间,这是需要把low重新置为mid+1
(low=mid+1);
else
return mid;//剩下的就是相等的情况,直接返回mid就是查找到的结果
}
return -1;//执行到这一步就说明,low》high,没有找到要查找的元素,返回-1表示没有结果
}
main()
{
int a={1,2,3,4,5,6,7,8,9,10};
int a,b,c;
b=4;
c=fun(a,10,b);
if(c==1)
printf(“not found“);
else
printf(“psition %d\n“,c);
}

C语言编程二分法


1、打开Python开发工具IDLE,新建‘search.py’。

2、F5运行程序,list1被正确排序,写这个的目的是说明二分法查找必须前提是一个有序的列表,如果一开始无序首先要排序,当数据量大的时候,快速排序是一个很好的选择,再进行二分法查找。

3、用递归的思想,递归就一定有结束条件。

4、if len(li)==1:   #li长度等于1,只比较这个列表元素与要查找到值return li==item。

5、if len(li)==0: #li长度等于0,全部查找结束还是没有这个值  return False。

6、为程序添加main方法。

7、F5运行程序,正确打印出二分法查找结果,False True。


c语言中如何将顺序表排序并实现二分法查找


void InsertSort(sq R)

这个函数是按值传递参数的。换句话说,你的顺序表在传递的时候被复制了一遍,然后这个函数收到的是一个副本,然后这个程序也许成功排序了这个副本,但是你原来的顺序表并没有改变。你可以考虑传递这个顺序表的指针。比如这样

void InsertSort(sq *pR)
{
    sq R = *pR;
    //以下不变
    ...
 }

调用的时候传递R的地址

InsertSort(&R);

求二分法排序的c语言算法


#include 《stdio.h》
int a={21,56,43,12,3,99,56,23,2,12};
main()
{
int i,j,k,low,high,mid,t;
for(i=k=1;i《sizeof a/sizeof a;i++)//起始认为第一个元素是有序的,high=low=k-1=0,所以k=1,
{
low=0;
high=k-1;
while(low《=high)////折半查找时,low与high相遇,则找到插入位置
{
mid=(low+high)/2;
if(a[mid]》=a[i])high=mid-1;///////元素比mid小,因此在low到mid-1范围内搜索位置
else low=mid+1;
}
if(high《i|| a[low]!=a[i]) ///////////
{
t=a[i];
for(j=k-1;j》=low;j--) //////插入位置是low,所以low到high=k-1范围内的元素都要向后移动
a[j+1]=a[j];
a[low]=t; //////////////low被赋值为已经被覆盖掉的a[i]
k++;
}
}
for(j=0;j《k;j++)
printf(“%4d“,a[j]);
printf(“\n“);
}
自己修改一下,把注释去了,能运行,刚刚运行过了。

C语言编程中什么是二分法


二分法查找,比如要从100个元素里找a元素,那么先分成两组,每组50,搜索一组,如果没有就将另一组分成两组25个,
再继续查找,每次搜索结束都将数目均分为两份