『壹』 c語言中二分法的具體程序是什麼呢
舉個例子:
//二分查找法//
#
include
void
main()
{
int
a[16],i,num,flag=0,top,bottom,mid;
//定義一個一維數組a[16]用來存放供查找用的數據,但只用a[1]——a[15]//
//num用來放要查找的數據,flag是表示是否找到的開關變數,top表示查找的起始位置,bottom表示查找的終止位置,mid表示top與bottom的中間位置//
char
goon;
//變數goon為'y'或'Y'時表示繼續下一輪查找,否則終止程序//
printf("請輸入第1個數字:\n");
scanf("
%d",&a[1]);
//依次輸入第二到第十五個數,並要求輸入的數遞減//
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",&num);
top=15;
bottom=1;
mid=15/2+1;
if(num>a[1]
||
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語言編寫一個函數二分法求根的演算法
二分法計算函數f(x)=x*x*x*x+2*x*x*x-x-1;
本程序在turbo c或c++下編譯
#include "stdio.h"
#include <math.h>
float f(float x)
{float y;
y=x*x*x*x+2*x*x*x-x-1;
return y;
}
void main()
{float a=0,b=0,h,y,x;
int k,n0;
printf("please input qujian a and b");
scanf("%f%f%d",&a,&b,&n0); /*輸入含根區間a,b,循環次數n0 */
for(k=0;k<=n0;k++)
{ x=(a+b)/2;
h=(b-a)/2;
y=f(x);
if(h<10e-6||fabs(y)<10e-6)
{ printf("k=%d,x=%f,y=%f",k,x,y);
break; } /*輸出分半次數k,函數的根x,及x對應的函數值.*/
else
{if(f(a)*f(x)<0)
b=x;
else a=x;
}
}
}
『叄』 用C語言編寫區間二分法過程的方法是什麼
int binSearch(int x, int a[], int n)
{
int low, high, mid;
low = 0;
high = n-1;
//注意,這里必須用<=, 用<不對,一直返回-1
while(low <= high)
{
mid = (low + high) / 2;
if(x < a[mid])
high = mid - 1;
else if(x > a[mid])
low = mid + 1;
else
return mid;
}
return -1;
}
這個案例是昨天在邢帥c語言的直播課老師講的,有時間你也來學習下。每天晚上視頻直播聽不懂還能領取視頻復習。搜邢帥c語言 就出來了
『肆』 C語言:二分法
這段代碼是求解方程f(x)=0在區間[-10,10]上的根的數值解。
方法的思想就是:一直選取區間中間的數值,如果發現中間的函數值與一側函數值,異號,那麼說明解在這個更小的區間中,採用eps=1e-5作為區間的極限大小,通過迭代的方法求解這個方程的數值解。
所以了解了上述思想,那麼else if(f(a)*f(c)<0) b=c; 說明的是 f(a)和f(c)異號,那麼使用b=(a+b)/2縮小迭代區間,繼續迭代;同理else a=c;說明f(a)和f(c)同號,那麼使用a(a+b)/2縮小迭代區間,繼續迭代!
『伍』 C語言 如何用二分法在已排序的數組中插入一個數(C CODE)
#include<stdio.h>
int main()
{
int n=9;//數組元素個數
int a[10]={0,1,2,3,4,6,7,8,9};
//開始兩分查找
int i,j,mid,insert=5;
i=0; j=n-1;
while(i<=j){
mid=(i+j)/2;
if(a[mid]>insert)
j=mid-1;
else if(a[mid]<insert)
i=mid+1;
else//a[mid]==inset,數據重復
return 0;
}
//兩分查找結束
//此時a[j]<insert<a[i],i-j=1
//把元素a[i...n-1]往後移
for(j=n;j>=i;j--)
a[j]=a[j-1];
//插入insert
a[i]=insert;
//調整元素個數
n++;
//輸出
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
其它補充:
(1)因為這是數組,數組插入元素時必須移動從插入位置往後所有的元素,所以用兩分法一點也不高效。想高效地用兩分法插入應該使用二叉樹。
(2)高效地往已排序的數組中插入元素應該直接從後往前一邊比較一邊移邊。
(3)程序中的兩分查找非常有用,如果不會,一定要掌握。尤其要了解當跳出while循環時i,j值的含義,這樣才能應對各種使用上的變化。
(4)本程序中,如果把insert改成-1或10,同樣可以運行。
『陸』 怎麼用C語言求二分法
二分法查找有一個前提,數據應該是排好序的,假設從小到大排列,則:
首先用中間那個數(也可以不是正中間,差一兩位沒有關系,只要保證不忽略數據就行)與查找值比較,大於查找值就跳到左邊。
然後重新設定新的數列。新的數列為,從最小的數值到中間那個數。
以這個新的數列為基礎,重復以上步驟。
『柒』 怎麼用C語言求二分法
二分法查找有一個前提,數據應該是排好序的,假設從小到大排列,則:
首先用中間那個數(也可以不是正中間,差一兩位沒有關系,只要保證不忽略數據就行)與查找值比較,大於查找值就跳到左邊。
然後重新設定新的數列。新的數列為,從最小的數值到中間那個數。
以這個新的數列為基礎,重復以上步驟。
『捌』 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<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;
}