C语言二分法编程问题

已有一个已排好序的数组(如{5,12,22,34,45,55,67,78,89,98}),要求输入一个数后,按原来排序的规律将它插入到该数组中,并用二分法查找新插入的数所在位置(下标)。假设:所有的数都互不相同。
求写思路和代码

第1个回答  推荐于2016-03-04
/* 二分法插入排序的算法源程序*/

#include<stdio.h>

#define MAXNUM 100
typedef int KeyType;
typedef int DataType;

typedef struct {
KeyType key; /* 排序码字段 */
/*DataType info; 记录的其它字段 */
} RecordNode;

typedef struct {
int n; /* n为文件中的记录个数,n<MAXNUM */
RecordNode record[MAXNUM];
} SortObject;

void binSort(SortObject * pvector) { /* 按递增序进行二分法插入排序 */
int i, j, left, mid, right;
RecordNode temp;
RecordNode *data = pvector->record;

for( i = 1; i < pvector->n; i++ ) {
temp = data[i];
left = 0; right = i-1; /* 置已排序区间的下、上界初值 */
while (left <= right) {
mid = (left + right)/2; /* mid指向已排序区间的中间位置 */
if (temp.key < data[mid].key)
right = mid-1; /* 插入元素应在左子区间 */
else left = mid+1; /* 插入元素应在右子区间 */
}
for (j = i-1; j >= left; j--)
data[j+1] = data[j]; /* 将排序码大于ki的记录后移 */
if (left != i) data[left] = temp;
}
}

SortObject vector={10, 49,38,65,97,76,13,27,49,50,101};

int main(){
int i;
binSort(&vector);
for(i = 0; i < vector.n; i++)
printf("%d ", vector.record[i]);
getchar();
return 0;
}追问

补两个问题,我给你提高悬赏100分。
1如何采用二分查找算法确定插入点?写出关键代码
2如果原数据中已经存在与新插入的数相等的数,用二分法查找到的下标一定是新插入数的位置吗?为什么?此时应如何理解所输出的下标值?

追答

二分法插入排序

算法思想简单描述:
在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
中间的那个元素比,如果小,则对前半再进行折半,否则对后半
进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
的所有元素后移,再把第i个元素放在目标位置上。

1、二分法查找插入位置
如果R[i]<R[m]成立,那右指针就要向左移动中间指针一位,否则,左指针要向左移动中间指针一位。反复查找,直到左指针大于右指针时停止。
2、插入
由1中得到的左指针其实就是元素要插入的位置。

本回答被提问者和网友采纳
第2个回答  2014-10-27
/*=========================================================================
工程名称: 练习
组成文件: main.c
功能描述: 在一个排好序的数据中用二分查找法,找出需要的数据
程序分析: 首先得从小到大排好序,二分再比较,不等则继续二分,直到高低碰头遍历结束
维护记录: 2014-09-11 v1.1
=========================================================================*/
#include <stdio.h>

//二分法对以排好序的数据进行查找
int binary_search(int array[],int value,int size)
{
int low=0,high=size-1,mid;

while(low<=high) //只要高低不碰头就继续二分查找
{
mid=(low+high)/2;
if(value==array[mid]) //比较是不是与中间元素相等
return mid;
else if(value > array[mid]) //每查找一次,就判断一次所要查找变量所在范围,并继续二分
low=mid; //如果大小中间值,下限移到中间的后一个位,上限不变,往高方向二分
else
high=mid; //上限移到中间的前一个位,往低方向二分
}
return -1;
}
int main(void)
{
int value;
int a[10]={0,1,2,3,4,5,6,7,8,9};
int n;

while(1)
{
printf("\n请输入你要查找的数字:\n");
scanf("%d",&value);
n = binary_search(a,value,10);
if(n==-1)
printf("数字没找到!\n");
else
printf("查找数据的下标是:%d\n",n);
}
}追问

是编具体的问题.....

用二分法求方程的根(C语言编写程序)
include <stdio.h> include <math.h> int main() { double x0, x1, x2, f0, f1, f2;do { printf("请输入两个点:");scanf("%lf,%lf", &x1, &x2);f1 = ((2 * x1 - 4) * x1 + 3) * x1 - 6; \/\/换成你自己的 方程 f2 = ((2 * x2 - 4) * x2 + 3) ...

C语言编程例题:用二分法求方程的解
a=c;说明f(a)和f(c)同号,那么使用a(a+b)\/2缩小迭代区间,继续迭代!

C语言二分法编程问题
\/* 二分法插入排序的算法源程序*\/ include<stdio.h> define MAXNUM 100 typedef int KeyType;typedef int DataType;typedef struct { KeyType key; \/* 排序码字段 *\/ \/*DataType info; 记录的其它字段 *\/ } RecordNode;typedef struct { int n; \/* n为文件中的记录个数,n<MAXNU...

C语言表编程:用二分法求一元三次方程的根 要求:又主函数调用求根子函数...
二分法的基本思路是:任意两个点x1和x2,判断区间(x1,x2)内有无一个实根,如果f(x1)与f(x2)符号相反,则说明有一实根。接着取(x1,x2)的中点x,检查f(x)和f(x2)是否同号,如果不同号,说明实根在(x,x2)之间,如果同号,在比较(x1,x),这样就将范围缩小一半,然后按上述方法不断的...

C语言二分法求解方程f(x)=0根
二分法是一种求解方程 $f(x) = 0$ 根的迭代算法,具体步骤如下:定义一个函数 $f(x)$;确定初始区间 $[a, b]$,使得 $f(a)$ 和 $f(b)$ 异号;在区间 $[a, b]$ 中取中点 $c = \\frac{a+b}{2}$,计算 $f(c)$;如果 $f(c) = 0$,则 $c$ 是方程的解,算法结束;...

编个C语言程序,用二分法求方程sinx- x^2\/2=0在x=1附近的根(精确到0....
sinx=x^2\/2有且仅有一解,即x=0。“输出每次迭代的结果以及所用”这是什么意思?代码写了,具体输入什么东西,你自己添加语句。注意:所输入的区间[x1,x2]要保证f(x1)*f(x2)<0,这样才能用二分法计算。代码如下:include "stdio.h"include "math.h"main(){ float x,x1,x2;float F(float...

C语言作业:二分法求方程2x^3-4x^2+3x-6=0在(-10,10)之间的根 中遇到的...
如果f(c)>0 则继续操作[b,c]否则操作[c,a]这个是二分法的核心 所以代码应该是 include <stdio.h># include <math.h>int main (){double a,b,c,d;a=10;b=-10;c=(a+b)\/2;d=2*c*c*c-4*c*c+3*c-6;while(fabs(d)>1e-8){if(d<0){b=c;c=(a+b)\/2;d=2*c*c*c...

小车问题,C语言编程 【问题描述】 甲,乙两人要同时从A地出发要尽快同时...
遇后,乙再乘车赶往B,最后甲、乙一起到达B地。这样问题就转换成了求K处的位置,我 们用二分法,不断尝试,直到满足同时到达的时间精度。算法框架如下:(1)输入s,a,b;(2)c0:=0;c1:=s;c:=(c0+c1)\/2;(3)求t1,t2;(4)如果t1<t2,那么c:=(c0+c)\/2 否则c:=(c+c1...

C语言实现二分法求解方程在区间内的根
这个过程重复进行,直到区间长度小于某个预设的精度阈值[公式],或找到满足条件的根为止。以一元n次多项式为例,我们可以编写C语言程序来实现这一过程。通过编程实现的二分法查找,可以在特定范围内找到方程的精确根,如对于多项式[公式],取上限[公式],并设定精度为[公式],程序会输出相应的根的解。

c语言编写程序,键盘输入任意x,y用二分法求开y次根号x的近似值,要求精确...
include<stdio.h> include<math.h> void main(){ double x,y,x3,x1,x2;x1=x;x2=-x;for(;fabs(pow(x,-y))<1e-10;){ x3=(x1-x2)\/2.0;if((pow(x,-y))>1e-6)x2=x3;else x1=x3;} printf("方程的根为%8.6f\\n",x3);} ...

相似回答