数据结构实验报告-排序与查找
时间:2020-09-01 16:11:57 来源:勤学考试网 本文已影响 人
电 子 科 技 大 学
实 验 报 告
学生姓名:XXX 学 号:2013220501018 指导教师:刘峤
实验地点:信软机房306 实验时间:2014/6/20
一、实验室名称:软件实验室
二、实验项目名称:数据结构与算法—排序与查找
三、实验学时:4
四、实验原理:
快速排序的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是:
1)设置两个变量I、J,排序开始的时候I:=1,J:=N
2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];
3)从J开始向前搜索,即(J:=J-1),找到第一个小于X的值,两者交换;
4)从I开始向后搜索,即(I:=I+1),找到第一个大于X的值,两者交换;
5)重复第3、4步,直到I=J。
二分法查找(折半查找)的基本思想:
(1)确定该区间的中点位置:mid=(low+high)/2?
min代表区间中间的结点的位置,low代表区间最左结点位置,high代表区间最右结点位置
(2)将待查a值与结点mid的关键字(下面用R[mid].key)比较,若相等,则查找成功,否则确定新的查找区间:
A)如果R[mid].key>a,则由表的有序性可知,R[mid].key右侧的值都大于a,所以等于a的关键字如果存在,必然在R[mid].key左边的表中,这时high=mid-1;
B)如果R[mid].key<a,则等于a的关键字如果存在,必然在R[mid].key右边的表中。这时low=mid;
C)如果R[mid].key=a,则查找成功。
(3)下一次查找针对新的查找区间,重复步骤(1)和(2)
(4)在查找过程中,low逐步增加,high逐步减少,如果high<low,则查找失败。
五、实验目的:
本实验通过实现快速排序和折半查找算法,使学生理解如何实现快速查找和排序的基本算法思想。通过练习,加强对算法的理解,提高编程能力。
六、实验内容:
(1)实现数据序列的输入;
(2)实现快速排序算法,并对输入的序列排序后输出;
(3)实现折半查找算法,并在步骤(2)排序后的序列上,进行任意地
查找,并输出查询结果。
七、实验器材(设备、元器件):
PC机一台,装有C/C++语言集成开发环境。
八、数据结构及程序
#include <stdio.h>
#define MAX_LEN 100
void Sort(int *data,int left,int right)
{
int i,j,temp;
i=left;
j=right;
temp=data[left];
if(left>right)
return;
while(i!=j){
while(data[j]>=temp&&j>i)
j--;
if(j>i)
data[i++]=data[j];
while(data[i]<=temp&&j>i)
i++;
if(j>i)
data[j--]=data[i];
}
data[i]=temp;
Sort(data,left,i-1);
Sort(data,i+1,right);
}
int Search(int *data,int start,int end,int key,int num)
{
int result;
int p = (start + end) / 2;
if (data[p] == key&&start<=end) {
result = p;
num++;
if (data[p] > key)
result = Search(data, start, p, key,num);
else
result = Search(data, p + 1, end, key,num);
return result;
}
else if (num==0&&start>end){
result = -1;
printf("\n 404 NO FOUND\n");
return result;
}
else if (num!=0&&start>end){
result=-1;
if (num==1)
printf("\nFounded number only one");
else
printf("\nFounded number more than one");
return result;
}
else if (result!=-1) {
if (data[p] > key)
result = Search(data, start, p - 1, key, num);
else
result = Search(data, p + 1, end, key, num);
return result;
}
else {
result=-1;
return result;
}
}
void loadFile(int *data,char *filename,int n){
int i;
FILE *pfile=NULL;
pfile=fopen(filename,"r");
if (!pfile){
printf("Open file fail\n");
exit(0);
}
else
printf("Open file success!\n");
for(i = 0 ; i < n; i++)
fscanf(pfile , "%d ",&data[i]);
}
int main(int argc, const char * argv[]) {
int input=1,data[MAX_LEN],num=0,key=1,i,cmd;
char filename[100];
printf("Choose Mode :\n 1.Input Mode 2.File Mode\n");
scanf("%d",&cmd);
if (cmd==1) {
printf("Input data :(Enter 0 to detemine)\n");
while (input!=0) {
printf("Enter the %d data :",num+1);
scanf("%d",&input);
if (input!=0){
data[num]=input;
num++;
}
}
}
else{
printf("\nInput the address of the file: ");
scanf("%s",filename);
printf("\nInput the number of elem: ");
scanf("%d",&num);
loadFile(data,filename,--num);
}
Sort(data, 0, num);
printf("\nSort result: ");
for (i=1; i<=num; i++)
printf("%d ",data[i]);
printf("\n\n");
while (key!=0) {
printf("\nInput a key to search :(Enter 0 to detemine)");
scanf("%d",&key);
if (key!=0)
Search(data, 0, num, key, 0);
}
return 0;
}
九、程序运行结果:
1.打开程序:
2.尝试手动输入模式:
3.搜索已存在数:
4.搜索不存在数:
5.尝试文件读入模式并搜索
实验成功。
十、实验结论:
使用好的排序与查找算法对于程序的运行效率至关重要,一个好的算法,适合的算法能使计算机对数据的处理事半功倍,而选用错误的算法,不但可能事倍功半,还有可能造成不稳定因素。
快速排序的时间复杂度为n(log2n),是排序算法中最为快速的一种,但是不稳定,对基本有序的序列效率较差。
二分查找算法在查找算法中,速度快,效率高,但是要求数据要有序。
十一、总结及心得体会:
当空间充足,对稳定性要求不高的情况,排序算法宜使用快速排序。
快速排序和二分查找配合,可以以较高的效率查找目标元素。