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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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[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);
参考技术A #include <stdio.h>
#include <stdlib.h>
#define NUM 10

/* 选择法排序 */
void asort(int *a, int s)

int i, j, k, t;

for (i = 0; i < s-1; ++i)

k = i;

for (j = i + 1; j < s; ++j)

if (a[k] > a[j])

k = j;



if (k != i)

t = a[i];
a[i] = a[k];
a[k] = t;




int bsearch(int *a, int s, int k)

int low = 0;
int high = s - 1;

while (low <= high)

int mid = (low + high) / 2;

if (k == a[mid])

return mid;

else

if (k < a[mid])
high = mid - 1;
else
low = mid + 1;



return -1;


int main()

int i, a[NUM], key;

printf("请输入%d个整数:\n", NUM);

for (i = 0; i < NUM; ++i)

scanf("%d", a + i);


asort(a, NUM);
printf("请输入一个想要查找的整数:");
scanf("%d", &key);

if (bsearch(a, NUM, key) != -1)
printf("查找成功!\n");
else
printf("查找失败!\n");

system("PAUSE");
return 0;
本回答被提问者采纳
参考技术B void SelectSort(float* pData,int Count)

float iTemp;
int iPos;
for(int i=0;i<Count - 1;i++)

iTemp = pData[i];
iPos = i;
for(int j=i + 1;j<Count;j++)

if(pData[j]<iTemp)

iTemp = pData[j];
iPos = j;


pData[iPos] = pData[i];
pData[i] = iTemp;


这个是把数组里面的元素按从小到大的顺序输出。

你调用的时候只需要送入数组的首地址以及元素个数就可以了。
参考技术C 书上有

C语言二分查找

// 二分查找.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])


int a[5],key,i;
int low=0,mid;
int high=4;

printf("请自小到大输入5个整数:\n");
for(i=0;i <5;i++)

scanf("%d",&a[i]);
printf("\n");

printf("请输入你要查找的数:\n");
scanf("%d",&key);

while(low <=high)

mid=(low+high)/2;
if(key==a[mid]) return mid;
else if(key <a[mid]) high=mid-1;
else low=mid+1;


printf("%d",mid);


各位大神 这是我的程序 哪里错了啊 看不出来啊 好人好人 你在哪里!!!

if(key==a[mid]) return mid; 这句就是罪魁祸首。呵呵你是想用return来结束while循环吧。用错了。
找到结果后,你应该是把结果输出出来,而不是用return。return语句是返回整个函数的,在你的程序里main函数就结束了,你当然看不到任何结果了。
改为:
if(key==a[mid]) break; *这行是结束while循环的。而不是你所用的return*/
参考技术A 把if(key==a[mid]) return mid;
改成
if(key==a[mid]) break;

把printf("%d",mid);
改成
if(low>high) printf("not found\n");
else printf("at %d",mid);
参考技术B 修改你的程序后得到是这样的

这个在语法上没有错了;
#include<stdio.h>
#include<math.h>
void main()

printf("方程为x*x*x-x-1=0.");
float m,n,mid;
double b,c,d;
printf("请输入区间:");
scanf("%f",&m);
scanf("%f",&n);
int s=1;
b=m*m*m-m-1;
c=n*n*n-n-1;
if(b*c>0.00)
printf("该方程在此区间没有根!");
else if(b*c==0.00)

if(b==0.00)
printf("该方程根为%f\n",m);
else if(c==0.00)
printf("该方程根为%f\n",n);

else if(b*c<0.00)


while(s!=0)

mid=(m+n)/2;
d=mid*mid*mid-mid-1;
if(d==0.00)

printf("根为%f\n",mid);
s=0;

else
if(d*b<0)

if(fabs(d-b)<=0.001000)

printf("根为%f\n",mid);
s=0;

else

n=mid;


else if(d*c<0)

if(fabs(d-c)<=0.001000)

printf("根为%f\n",mid);
s=0;

else

m=mid;






你试试看
不行再跟我M下;
参考技术C 能把错误描述一下吗?

以上是关于c语言如何实现-数组排序,二分查找的主要内容,如果未能解决你的问题,请参考以下文章

如何实现数组的二分查找

php如何实现统计一个数字在排序数组中出现的次数(代码)

二分查找

c语言编程实现“折半查找”的过程。

二分查找(折半查找)算法详解(C语言实现)

C语言过滤相同行算法