#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAXSIZE 8000
typedef struct //创建顺序表,count用于记录查找次数
{
int data[MAXSIZE];
int count=0;
}SqList;
void Bubble_Sort(SqList *&L,int i) //实现冒泡排序
{
int temp;
for(; i<MAXSIZE; i++)
{
if(L->data[i]>L->data[i+1])
{
temp = L->data[i];
L->data[i]=L->data[i+1];
L->data[i+1]=temp;
}
}
for(int i=0; i<MAXSIZE; i++)
{
if(L->data[i] > L->data[i+1])
{
Bubble_Sort(L,i);
}
}
}
void RWriteData(char *FileName, int size, int type) //生成伪随机数
{
int i,j;
FILE *fp;
srand((unsigned)time(NULL));
if ((fp=fopen(FileName, "w"))==NULL)
{
printf("No such file exist.");
exit (0);
}
if (type==1)
{
printf("\n------------------random integers----------------\n");
}
for (i=0;i<size;i++)
{
j=rand()%10000;
fprintf(fp,"%d ", j);
if (type==1)
{
printf("%d ",j);
}
}
printf("\n");
fclose(fp);
}
void GetData(char *FileName,SqList *&L) //将伪随机数存储入顺序表中
{
FILE *fp;
if ((fp=fopen(FileName, "r"))==NULL)
{
printf("No such file exist.");
exit (0);
}
else
{
int data,i=0;
L = (SqList*)malloc(sizeof(SqList));
while(fscanf(fp,"%d",&data)!= EOF )
{
L->data[i]= data;
i++;
}
}
fclose(fp);
}
int BinSearch(SqList *L,int j,int i,int count,int f) //实现折半查找
{
int high=j, low=0, mid;
while(low <= high)
{
mid = (high+low)/2;
if(L->data[mid]==i)
{
if(f==1)
{
printf("此次查找的查找次数为:%d\n",count);
}
L->count = count;
return mid+1;
}
if(L->data[mid]<i)
{
low = mid+1;
}
else
{
high = mid-1;
}
count++;
}
printf("此次查找的查找次数为:%d\n",count);
L->count = count;
return NULL;
}
int main()
{
SqList *L;
FILE *fp;
int search;
RWriteData("Pre_Bubble_Sort.txt",MAXSIZE,1);
GetData("Pre_Bubble_Sort.txt",L);
printf("\n");
Bubble_Sort(L,0);
if((fp=fopen("Search_Count.txt","w"))==NULL)
{
printf("No such file exist.");
exit (0);
}
else
{
int Calculation=0;
for(int i=0; i<10; i++)
{
printf("请输入第%d次要查找的数字:",i+1);
scanf("%d",&search);
int count=1;
if(BinSearch(L,MAXSIZE-1,search,count,0)==NULL)
{
printf("该列表内不存在这一数字\n\n");
fprintf(fp,"第%d次查找的查找次数: ",i+1);
fprintf(fp,"%d\n",L->count);
Calculation += L->count;
}
else
{
printf("%d位于列表的第%d个位置\n\n",search,BinSearch(L,MAXSIZE-1,search,count,1));
fprintf(fp,"第%d次查找的查找次数: ",i+1);
fprintf(fp,"%d\n",L->count);
Calculation += L->count;
}
}
fprintf(fp,"平均查找次数为: ");
fprintf(fp,"%f",((Calculation%10)*0.1)+(Calculation/10));
fclose(fp);
}
}
运行结果