『壹』 c語言,二分法查找無序的一維數組中的一個元素,輸出其位置
如果是無序的,需要排序
#include<stdio.h>
intbinSearch(int,int,int);
main()
{
inti,n=10,x=7;
inta[10];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
//排序略
binSearch(x,a,n));
return0;
}
intbinSearch(intx,inta[],intn)
{
intlow,high,mid;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(x<a[mid])
high=mid-1;
elseif(x>a[mid])
low=mid+1;
else
returnmid;
}
return-1;
}
『貳』 求!C語言一維數組編程:在一維數組中查找一個指定的值,找到返回其位置序號,未找到返回0。
給你找一個C語言的折半查找法,解決這種任務的第一演算法
http://ke..com/view/610605.htm?from_id=9796273&type=syn&fromtitle=%E6%8A%98%E5%8D%8A%E6%9F%A5%E6%89%BE&fr=aladdin
C語言數組下標從 0 開始 找不到應該返回-1
C語言代碼
intBinSearch(SeqList*R,intn,KeyTypeK)
{
//在有序表R[0..n-1]中進行二分查找,成功時返回結點的位置,失敗時返回-1
intlow=0,high=n-1,mid;//置當前查找區間上、下界的初值
if(R[low].key==K)
returnlow;
if(R[high].key==k)
returnhigh;
while(low<=high)
{
//當前查找區間R[low..high]非空
mid=low+((high-low)/2);
//使用(low+high)/2會有整數溢出的問題
//(問題會出現在當low+high的結果大於表達式結果類型所能表示的最大值時,
//這樣,產生溢出後再/2是不會產生正確結果的,而low+((high-low)/2)不存在這個問題
if(R[mid].key==K)
returnmid;//查找成功返回
if(R[mid].key>K)
high=mid-1;//繼續在R[low..mid-1]中查找
else
low=mid+1;//繼續在R[mid+1..high]中查找
}
if(low>high)
return-1;//當low>high時表示查找區間為空,查找失敗
}//BinSeareh
修改了下 適應數組
intBinSearch(int *R,intn,KeyTypeK)
{
//在有序表R[0..n-1]中進行二分查找,成功時返回結點的位置,失敗時返回-1
intlow=0,high=n-1,mid;//置當前查找區間上、下界的初值
if(R[low]==K)
returnlow;
if(R[high]==k)
returnhigh;
while(low<=high)
{
//當前查找區間R[low..high]非空
mid=low+((high-low)/2);
//使用(low+high)/2會有整數溢出的問題
//(問題會出現在當low+high的結果大於表達式結果類型所能表示的最大值時,
//這樣,產生溢出後再/2是不會產生正確結果的,而low+((high-low)/2)不存在這個問題
if(R[mid]==K)
returnmid;//查找成功返回
if(R[mid]>K)
high=mid-1;//繼續在R[low..mid-1]中查找
else
low=mid+1;//繼續在R[mid+1..high]中查找
}
if(low>high)
return-1;//當low>high時表示查找區間為空,查找失敗
}//BinSeareh
『叄』 C語言一維數組中如何查找指定元素
1、打開pycharm,新建Test_List.py,如圖所示。
『肆』 利用二分法查找無序的一維數組中的一個元素,輸出其位置,C語言實現。
(如果排序再二分找到的位置就不是原來的位置了) 你說的是對的
但是你在排序的過程中可以記錄數據的初始位置啊
『伍』 用C語言對一維數組排序,並輸出原來的位置
可以先用冒泡排序對數組進行排序,然後對排序的數組進行遍歷,找出其在排序之前數組中的位置,參考代碼如下:
#include<stdio.h>
#include<string.h>
#defineN5
intmain()
{
inta[N],b[N],c[N],i,j,temp;
for(i=0;i<N;i++){//輸入數組,並用b保存數組a的值
scanf("%d",&a[i]);
b[i]=a[i];
}
for(i=0;i<N-1;i++)//對a從大到小冒泡排序
for(j=0;j<N-i-1;j++)
if(a[j]<a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
for(i=0;i<N;i++)//輸出排序後的a
printf("%d",a[i]);
printf(" ");
for(i=0;i<N;i++)//遍歷找出以前的位置
for(j=0;j<N;j++){
if(a[i]==b[j])
c[i]=j;
}
for(i=0;i<N;i++)//輸出位置數組
printf("%d",c[i]+1);
printf(" ");
return0;
}
/*
運行結果:
38476
87643
24531
*/
『陸』 c語言中函數能返回一個數組嗎
不能直接返回一個數組,但是可以用其他方式實現類似功能。
方法1:利用全局變數
分析:全局變數作為C語言的一個知識點,雖然我們都了解它的特點,但在實際教學過程中應用得並不是很多。由於全局變數的作用域是從定義變數開始直到程序結束,而對於編寫有多個返回值的C語言函數,我們可以考慮把要返回的多個值定義成全局變數。當函數被調用時,全局變數被更改,我們再把更改後的全局變數值應用於主調函數中。函數被調用後被更改後的全局變數值即為函數的數個返回值。下面以一個實例演示該方法的應用。
實例1:編寫函數求3個數中的最大值與最小值。
方法:把最大值、最小值分別定義成2個全局變數max、min,在用戶自定義函數中把求出來的最大值與最小值分別賦給全局變數max、min。函數調用完畢後全局變數的max、min值即保存了函數要求返回的值。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
int max,min;/*定義兩個全局變數用於保存函數返回值*/
void max_min(int a,int b,int c) /*定義求最大最小值的函數*/
{max=min=a; /*初始化最大最小值*/
if(max if(max if(min>b)min=b;
if(min>c)min=c;
}
main()
{int x,y,z;
printf(" 請輸入3個整數:\n");
scanf("%d,%d,%d",&x,&y,&z);
max_min(x,y,z) ;/*調用求最大值與最小值的函數*/
printf("三個數中的最大值為:%d;最小值為:%d",max,min);/*輸出最大值與最小值*/
getch();
}
調試結果如下:
請輸入3個整數:
5,-6,2
三個數中的最大值為:5;最小值為:-6
注意:該方法雖然可以實現有多個返回值的函數,但由於全局變數不能保證值的正確性(因為其作用域是全局,所以程序范圍內都可以修改它的值,如果出現錯誤將非常難以發現),並且全局變數增加了程序間模塊的耦合,所以該方法要慎用。
方法2:傳遞數組指針
分析:在教學過程中,我們知道C語言函數參數的傳遞方式有值傳遞與地址傳遞。當進行值傳遞時,主調函數把實參的值復制給形參,形參獲得從主調函數傳遞過來的值運行函數。在值傳遞過程中被調函數參數值的更改不能導致實參值的更改。而如果是地址傳遞,由於傳遞過程中從實參傳遞過來的是地址,所以被調函數中形參值的更改會直接導致實參值的更改。因此,我們可以考慮把多個返回值作為數組元素定義成一個數組的形式,並使該數組的地址作為函數的形式參數,以傳址方式傳遞數組參數。函數被調用後,形參數組元素改變導致實參改變,我們再從改變後的實參數組元素中獲得函數的多個返回值。以下實例演示該方法的應用。
實例2:編寫函數求一維整形數組的最大值與最小值,並把最大值與最小值返回給主調函數。
方法:以指針方式傳遞該一維數組的地址,然後把數組的最大值與數組的第一個元素交換,把數組的最小值與最後一個元素交換。函數被調用完畢後,實參數組中的第一元素為數組的最大值,實參數組中最後一個元素為數組的最小值,從而實現返回數組的最大值與最小值的功能。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
void max_min(int *ptr,int n) /*定義求數組最大值最小值的函數,傳遞數組指針*/
{int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int *temp;/*用於交換位置*/
*temp=*ptr;
for(i=0;i{
if(*ptr<*(ptr+i))/*最大值與第一個元素進行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)>*(ptr+i))/*最小值與最後一個元素進行交換*/
{
j=i;
*temp =*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)= *temp ;}
}
}
/*調用最大最小值函數*/
main()
{
int A[6],i;
for(i=0;i<6;i++)
scanf("%d",&A[i]);
max_min(A,6);
printf("max=%d, min=%d\n \n",A[0],A[5]);
getch();
}
調試結果如下:
請輸入6個整形數,以空格隔開:
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用於多個返回值的數據類型一致的情況。當返回值數據類型不一致時,不適用該方法
『柒』 編寫C語言程序,查找一個一維數組中的最大值,列印出該元素及其位置。
#include <stdio.h>
int main(void)
{
int a[5],j,i,k;
puts("輸入數值 以空格間隔");
for(i=0;i<5;i++)
scanf("%d",&a[i]);
j=a[0];
for(i=1;i<5;i++)
{
if (a[i]>j)
{j=a[i];
k=i;
}
}
printf("最大數為=%d 是第%d個元素",j,k);}
『捌』 用c語言寫一個函數確定一個元素在數組中的位置並在別的函數中調用這個函數的返回值確定元素在的位置。
你可以返回s數組的首地址,函數可以這么定義:
int* f1(int a[], int n, int k)
{
....//你的代碼
return s;
}
『玖』 用C語言對一維數組排序,並輸出已排好元素的原來位置
簡單的思路:
定義一個指針數組,找到b數組中元素在a數組中的地址,並存儲在指針數組對應位置。
之後將指針數組內的地址值依次取出來與a數組首地址相減,得到的就是原來的位置。
利用的原理:數組內地址是連續的!
#include<stdio.h>
intmain()
{
inta[5]={3,8,4,7,6},b[5]={8,7,6,4,3},c[5],i,j,*p[5];
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(b[i]==a[j])
p[i]=&a[j];
}
}
for(i=0;i<5;i++)
c[i]=p[i]-&a[0]+1;
printf("原來的位置數組c[5]={%d,%d,%d,%d,%d}
",c[0],c[1],c[2],c[3],c[4]);
}
『拾』 c語言中函數返回值是指向一維數組的指針的函數怎麼寫
#include <stdio.h>
double (*p)[2];
double dA[3][2] = {{1.0,1.0},{1.1,1.0},{1.0,1.0}};
double (*read(int n))[2]{
// 在gcc下編譯,函數頭有些奇怪,類似於表達式變數
// 樓上用typedef是正道
p = &dA[0];
return p;
}
int main() {
printf("dA[1][0]=%lf\n",**(read(0)+1));
return 1;
}