对于经过排序的数据,使用折半查找,可提高查找速度。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 15
int isearch(int a[], int n, int x);
void quicksort(int *a,int p,int r);
int partition(int *a,int p,int r);
int main()
{
int arr[N],x,n,i;
srand(time(NULL));
for(i=0;i<N;i++)
{
arr[i]=rand()/1000+100;
}
printf("\n原数据序列:\n");
for(i=0;i<N;i++)
{
printf("%d ",arr[i]);
}
quicksort(arr,0,N-1);
printf("\n排序后数据序列:\n");
for(i=0;i<N;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
printf("输入要查找的数:");
scanf("%d", &x);
n=isearch(arr,N,x);
printf("\n数据序列:\n");
for(i=0;i<N;i++)
{
printf("%d ",arr[i]);
}
printf("\n\n");
if(n<0)
printf("没有找到数据:%d\n",x);
else
printf("数据:%d位于数组的第%d个元素处。\n",x,n+1);
system("pause");
return 0;
}
void quicksort(int *a,int p,int r)
{
int q;
if(p<r)
{
q=partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}
int partition(int *a,int p,int r)
{
int i,j,x,t,s;
x=a[r];
i=p-1;
for(j=p;j<r;j++)
{
if(a[j]<=x)
{
i++;
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
s=a[i+1];
a[i+1]=a[r];
a[r]=s;
return i+1;
}
int isearch(int a[],int n,int x)
{
int mid,low,high;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)
return mid;
else
if(a[mid]>x)
high=mid-1;
else
low=mid+1;
}
return -1;
}