C语言实现冒泡排序和折半查找

#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);			
	}
}

运行结果

在这里插入图片描述
在这里插入图片描述

冒泡排序前的伪随机数

在这里插入图片描述

查找记录

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/The_RedMaple/article/details/109742354
今日推荐