当前位置:首页 » 操作系统 » 查找算法c实现

查找算法c实现

发布时间: 2022-11-06 18:04:12

c语言 指针和函数编程实现折半查找算法


//二分法查找算法
intbinary_search(intarr[],int*top,int*bot,intx){
if(*bot>=*top){
intindex=*top+(*bot-*top)/2;
int*mid=&index;

if(arr[*mid]==x)return*mid;
if(arr[*mid]>x){//x在左侧
*mid=*mid-1;
returnbinary_search(arr,top,mid,x);
}
else{//x在右侧
*mid=*mid+1;
returnbinary_search(arr,mid,bot,x);
}
}

return-1;
}

voidmain()
{
inta[10]={1,3,5,7,8,9,12,13,15,17};
intn=sizeof(a)/sizeof(a[0]),x=13,t=0;

int*top=&t,*bot=&n;
*bot=*bot-1;

intindex=binary_search(a,top,bot,x);

if(index>=0){
printf("%d在数组索引为[%d]的位置 ",x,index);
}
else{
printf("%d在数组中不存在! ",x);
}
}

㈡ 利用C语言定义有序数组,实现二分查找算法

#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[1000];
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语言折半查找法

折半查找法是算法一种,可以被任何计算机语言使用。用C语言自然也可以实现。

1、定义:

在计算机科学中,折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

2、查找规则:

折半查找法是效率较高的一种查找方法。假设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,其基本思想是: 设查找数据的范围下限为l=0,上限为h=4,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m-1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。

3、C语言参考代码:

intbin_search(intA[],intn,intkey){
//在长度为n的数组A中折半查找值为key的元素,并返回下标值。如果不存在则返回-1.
intlow,high,mid;
low=0;
high=n-1;//初始low和high为数组的两端。
while(low<=high)
{
mid=(low+high)/2;//查找中心点。
if(A[mid]==key)returnmid;//已找到,返回下标值。
if(A[mid]<key){//中点位置比key值小,以mid+1为新的下限值。
low=mid+1;
}
if(A[mid]>key){//中点位置比key值大,以mid-1为新的上限值。
high=mid-1;
}
}
return-1;//未找到,返回-1.
}

㈣ C语言 查找算法实现

#include

int main() {
int i,x,n,*result = NULL;
int a[10],low,high,mid;

scanf_s("%d",&n);
// 确保输入的数据是非递减的
for(i = 0 ; i < n && i < 10 ; i++) {
scanf_s("%d",&a[i]);
}

fflush(stdin); // 如果输入的数组元素多于10个,则废弃
scanf_s("%d",&x);

low = 0,high = n - 1;
while(low <= high) {
mid = (low + high) / 2;
if(x == a[mid]) {
result = &a[mid]; // 这里给出的是查找到该元素的指针
break;
}
else if(x < a[mid]) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
if(result != NULL) {
printf("%d\n",*result);
}
else {
printf("no result\n");
}
return 0;
}

㈤ 诚求用C语言编一个实现常见查找算法。

折半查找,数组存放的是从31到3的奇数,按从大到小的顺序放入
#include <stdio.h>
void main()
{
int array[15];
int i,number;
int top,end,half,temp;
top = 0;
end = 15;
temp = 0;
half = (top + end) / 2;
for(i = 0;i < 15;i++)
array[i] = 2 * (15 - i) + 1;
printf("please input the number:\n");
scanf("%d",&number);
if(number > array[0] || number < array[14])
printf("the array hasn't the number!\n");
else
{
while(top != end)
{
if(array[half] > number)
top = half;
else if(array[half] < number)
end = half;
else
{
printf("the number is the %d number of array!\n",half + 1);
break;
}
temp = half;
half = (top + end) / 2; //折半查询
if(temp == half)
{
printf("the array hasn't the number!\n");
break;
}
}
}
}

㈥ C语言编写数据结构查找算法

实验五 查找的实现
一、 实验目的
1.通过实验掌握查找的基本概念;
2.掌握顺序查找算法与实现;
3.掌握折半查找算法与实现。
二、 实验要求
1. 认真阅读和掌握本实验的参考程序。
2. 保存程序的运行结果,并结合程序进行分析。
三、 实验内容
1、建立一个线性表,对表中数据元素存放的先后次序没有任何要求。输入待查数据元素的关键字进行查找。为了简化算法,数据元素只含一个整型关键字字段,数据元素的其余数据部分忽略不考虑。建议采用前哨的作用,以提高查找效率。
2、查找表的存储结构为有序表,输入待查数据元素的关键字利用折半查找方法进行查找。此程序中要求对整型量关键字数据的输入按从小到大排序输入。
一、顺序查找
顺序查找代码:
#include"stdio.h"
#include"stdlib.h"
typedef struct node{
intkey;
}keynode;
typedef struct Node{
keynoder[50];
intlength;
}list,*sqlist;
int Createsqlist(sqlist s)
{
inti;
printf("请输入您要输入的数据的个数:\n");
scanf("%d",&(s->length));
printf("请输入您想输入的%d个数据;\n\n",s->length);
for(i=0;i<s->length;i++)
scanf("%d",&(s->r[i].key));
printf("\n");
printf("您所输入的数据为:\n\n");
for(i=0;i<s->length;i++)
printf("%-5d",s->r[i].key);
printf("\n\n");
return1;
}
int searchsqlist(sqlist s,int k)
{
inti=0;
s->r[s->length].key=k;
while(s->r[i].key!=k)
{

i++;
}
if(i==s->length)
{
printf("该表中没有您要查找的数据!\n");
return-1;
}
else
returni+1;
}
sqlist Initlist(void)
{
sqlistp;
p=(sqlist)malloc(sizeof(list));
if(p)
returnp;
else
returnNULL;
}
main()
{
intkeyplace,keynum;//
sqlistT;//
T=Initlist();
Createsqlist(T);
printf("请输入您想要查找的数据的关键字:\n\n");
scanf("%d",&keynum);
printf("\n");
keyplace=searchsqlist(T,keynum);
printf("您要查找的数据的位置为:\n\n%d\n\n",keyplace);
return2;
}
顺序查找的运行结果:
二、折半查找
折半查找代码:
#include"stdio.h"
#include"stdlib.h"
typedef struct node{
intkey;
}keynode;
typedef struct Node{
keynoder[50];
intlength;
}list,*sqlist;
int Createsqlist(sqlist s)
{
inti;
printf("请输入您要输入的数据的个数:\n");
scanf("%d",&(s->length));
printf("请由大到小输入%d个您想输入的个数据;\n\n",s->length);
for(i=0;i<s->length;i++)
scanf("%d",&(s->r[i].key));
printf("\n");
printf("您所输入的数据为:\n\n");
for(i=0;i<s->length;i++)
printf("%-5d",s->r[i].key);
printf("\n\n");
return1;
}
int searchsqlist(sqlist s,int k)
{
intlow,mid,high;
low=0;
high=s->length-1;
while(low<=high)
{
mid=(low+high)/2;
if(s->r[mid].key==k)
returnmid+1;
elseif(s->r[mid].key>k)
high=mid-1;
else
low=mid+1;
}
printf("该表中没有您要查找的数据!\n");
return-1;
}
sqlist Initlist(void)
{
sqlistp;
p=(sqlist)malloc(sizeof(list));
if(p)
returnp;
else
returnNULL;
}
main()
{
intkeyplace,keynum;//
sqlistT;//
T=Initlist();
Createsqlist(T);
printf("请输入您想要查找的数据的关键字:\n\n");
scanf("%d",&keynum);
printf("\n");
keyplace=searchsqlist(T,keynum);
printf("您要查找的数据的位置为:\n\n%d\n\n",keyplace);
return2;
}
折半查找运行结果:
三、实验总结:
该实验使用了两种查找数据的方法(顺序查找和折半查找),这两种方法的不同之处在于查找方式和过程不同,线性表的创建完全相同,程序较短,结果也一目了然。

㈦ c语言排序和查找

1)利用readData()函数从data1.txt中读入不同规模的数据存入数组,
编写基于数组的顺序查找算法,测试数据量为1万、5万、10万、20万、
30万、40万和50万时的数据查询时间。
算法代码如下:

1 int seqsearch(int a[],int n,int key)
2 {
3 int k=n-1;
4 while(k>=0&&a[k]!=key)
5 k--;
6 return (k);
7 }

2)利用readData()函数从data2.txt中读入不同规模的有序数据存入数组,
编写基于数组的二分查找算法,测试数据量为1万、5万、10万、20万、30万、
40万和50万时的数据查询时间。
算法代码如下:

1 int binSearch(int a[],int n,int key)
2 {
3 int low=0;
4 int high=n-1;
5 int mid;
6 while(low<=high)
7 {
8 mid=(low+high)/2;
9 if(a[mid]==key) return mid;
10 if(a[mid]>key)
11 high=mid-1;
12 else
13 low=mid+1;
14 }
15 return -1;
16 }

3)请设计冒泡排序算法函数void bubbleSort(int a[],int n),对a[1]..a[n]进行升序排序。
并测试在不同数据规模下的排序效率。
算法代码如下:


1 void bubbleSort(int a[],int n)
2 {
3 int i=1,j,flag=1;
4 while(i<=n-1&&flag)
5 {
6 flag=0;
7 for(j=1;j<=n-1-i;j++)
8 if(a[j+1]<a[j])
9 {
10 a[0]=a[j];
11 a[j]=a[j+1];
12 a[j+1]=a[0];
13 flag=1;
14 }
15 i++;
16 }
17 }

㈧ c语言顺序查找法

如果是在已有n个元素的数组a中顺序查找值为x的元素,以下是实现查找的函数代码,查找成功则返回此元素的位置,否则返回-1:
int find(int a[],int n,int x)
{int i;
for(i=0;i<n&&a[i]!=x;i++);
return i<n?i:-1;
}

㈨ 怎样写二分查找算法的程序(用C语言实现)

我用一个子函数实现的,主函数你自己写,对你又好处,需要传入一个数组和数组长度n以及要查找的数,如果查找成功,返回x在数组中的位置,否则返回-1
int search(int *a,int x)
{ int low=0,high=n-1,mid,flag=-1;
while(low<=high)
{ mid=(low+high)/2;
if(a[mid]==x) return mid;
else if(a[mid]>low) low=mid+1;
else high=mid-1;
}
return flag;
}

㈩ 如何用C语言编写一个链表结点查找的算法

#include<iostream>

using namespace std;
class Chain;
class ChainNode
{
friend Chain;
private:
int data;
ChainNode *link;
};

class Chain
{
public:
Chain();
~Chain();
bool IsEmpty()const{return first==0;}

void fun();//查找函数

private:
ChainNode *first;//指向第一个节点指针
};
Chain::Chain()
{
first=new ChainNode;
first->data=1;
first->link=NULL;
}
Chain::~Chain()
{
ChainNode *next;
while(first)
{
next=first->link;
delete first;
first=next;
}
}
void Chain::fun(int key)
{
if(first==NULL)
return;
ChainNode *p=first->link;
while(p!=NULL)
{
if(p->data==key)
return 1;
else
p=p->link;
}
}
int main()
{
int n;
Chain mychain1;
cout<<"请输入需要查找的节点的关键值:";
cin>>n;
mychain1.fun(n);
cout<<endl;
return 0;
}

热点内容
压缩一定 发布:2025-05-15 06:57:30 浏览:287
进栈算法 发布:2025-05-15 06:56:02 浏览:213
安卓和缓存 发布:2025-05-15 06:56:02 浏览:426
笔记本电脑台式服务器 发布:2025-05-15 06:40:41 浏览:108
4k无压缩 发布:2025-05-15 06:02:54 浏览:74
hp存储6350 发布:2025-05-15 05:40:41 浏览:233
怎么更改电脑默认缓存位置 发布:2025-05-15 05:39:01 浏览:877
安卓qq公孙离在哪个战区战力最低 发布:2025-05-15 05:38:58 浏览:493
androidffmpeg压缩 发布:2025-05-15 05:37:02 浏览:288
ftp简称是 发布:2025-05-15 05:37:02 浏览:121