排序查找数据结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#define MAXE 20 //线性表中最多元素个数
#define MAXL 100 //定义表中最多纪录个数
typedef int KeyType;
typedef char InfoType[10];
typedef struct //记录类型
{
KeyType key; //关键字项
InfoType data; //其它数据项,类型为InfoType
}RecType;
typedef RecType SeqList[MAXL]; //顺序表类型
void QuickSort(RecType R[],int s,int t) //对R[s]至R[t]的元素进行快速排序
{
int i=s,j=t,k;
RecType temp;
if(s
while(i!=j) //从区间两端交替向中间扫描,直至i=j为止
{while(j>i&&R[j].key>temp.key)
j--; //从右向左扫描,找第一个关键字小于temp.key的R[j]
if(i
i++;
}
while(i
if(i
j--;
}
}
R[i]=temp;
printf(" "); //输出每一趟的排序结果
for(k=0;k<10;k++)
if(k==i)
printf("[%d]",R[k].key);
else
printf("%4d",R[k].key);
printf("\n");
QuickSort(R,s,i-1); //对左区间递归排序
QuickSort(R,i+1,t); //对右区间递归排序
}
}
int BinSearch(SeqList R,int n,KeyType k) //二分查找算法
{
int low=0,high=n-1,mid,count=0;
while(low<=high)
{
mid=(low+high)/2;
printf("第%d次查找:在[%d,%d]中查找到元素R[%d]:%d\n",
++count,low,high,mid,R[mid].key);
if(R[mid].key==k) //查找成功返回
return mid;
if(R[mid].key>k) //继续在R[low..mid-1]中查找
high=mid-1;
else
low=mid+1; //继续在R[mid+1..high]中查找
}
return-1;
}
void main()
{
FILE *fp1,*fp2;
if((fp1=fopen("QuickSort.txt","r"))==NULL)
{
printf("file cannot bo opened \n");
exit(1);
}
int i=0,k,n=10;
RecType R[MAXE];
KeyType a[MAXE];
while(!feof(fp1))
{
fscanf(fp1," %d ",&a[i]);
i++;
}
n=i;
for(i=0;i
printf("\n");
printf(" 初始关键字 "); //输出初始关键字序列
for(k=0;k
printf("\n");
QuickSort(R,0,n-1);
if((fp2=fopen("search.txt","w+"))==NULL)
{printf("file cannot bo opened \n");
exit(1);
}
printf(" 最后结果 "); //输出最终结果
for (k=0;k
printf(" %4d ",R[k].key);
fprintf(fp2," %d ",R[k].key);
}
printf("\n\n");
KeyType j;
scanf(" %d ",&j);
if((i=BinSearch(R,n,j))!=-1)
printf("元素%d的位置是%d\n",k,i);
else
printf("元素%d不在表中\n",k);
printf("\n");
}