• 领导讲话
  • 自我介绍
  • 党会党课
  • 文秘知识
  • 转正申请
  • 问题清单
  • 动员大会
  • 年终总结
  • 工作总结
  • 思想汇报
  • 实践报告
  • 工作汇报
  • 心得体会
  • 研讨交流
  • 述职报告
  • 工作方案
  • 政府报告
  • 调研报告
  • 自查报告
  • 实验报告
  • 计划规划
  • 申报材料
  • 当前位置: 勤学考试网 > 公文文档 > 领导讲话 > 正文

    数据结构实验报告-排序与查找

    时间: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),是排序算法中最为快速的一种,但是不稳定,对基本有序的序列效率较差。

    二分查找算法在查找算法中,速度快,效率高,但是要求数据要有序。

    十一、总结及心得体会:

    当空间充足,对稳定性要求不高的情况,排序算法宜使用快速排序。

    快速排序和二分查找配合,可以以较高的效率查找目标元素。

    相关热词搜索: 实验报告 数据结构 排序 查找

    • 考试时间
    • 范文大全
    • 作文大全
    • 课程
    • 试题
    • 招聘
    • 文档大全

    推荐访问