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);
各位大神 这是我的程序 哪里错了啊 看不出来啊 好人好人 你在哪里!!!
找到结果后,你应该是把结果输出出来,而不是用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语言如何实现-数组排序,二分查找的主要内容,如果未能解决你的问题,请参考以下文章