数据结构课程设计查找排序.docx
- 文档编号:9227550
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:15
- 大小:164.62KB
数据结构课程设计查找排序.docx
《数据结构课程设计查找排序.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计查找排序.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构课程设计查找排序
查找及排序算法实现
一、实验目的
1、熟练掌握二叉排序树查找算法及C语言描述。
2、熟练掌握折半查找算法及C语言描述。
3、熟练掌握简单选择排序算法及C语言描述。
4、熟练掌握简单插入排序算法及C语言描述。
5、熟练掌握冒泡(起泡)排序算法及C语言描述。
6、了解各种查找及排序算法的优缺点、实用性及应用。
7、将理论与实际相结合,切实提高自己的逻辑能力和动手能力。
二、设计内容
1.折半查找算法
折半查找算法的思路:
初始状态:
假设表长为n,low、high和mid分别指向待查元素所在区间的下界、上界和中点,key为给定值,初始时,令low=0,high=n-1,mid=(low+high)/2
让key与mid指向的记录比较
若key==r[mid].key,查找成功,算法结束;若key
2.起泡排序算法
起泡排序的思路:
首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即L.r[1].key>L.r[2].key),则将两个记录交换之,然后比较【第二个记录和第三个记录】的关键字。
以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止。
上述过程称做第一趟起泡排序,其结果使得关键字最大的记录被安置到最后一个记录的位置上,然后进行第二趟起泡排序,对前n-1个记录进行同样操作,其结果是使关键字次大的记录被安置到第n-1个记录的位置上。
一般地,第i躺起泡排序是从L.r[1]到L.r[n-i+1]以此比较相邻两个记录的关键字,并在“逆序”时交换相邻记录,其结果是这n-i+1个记录中关键字最大的记录被交换到第n-i+1的位置上。
整个排序过程需进行k(1<=k 3.简单选择算法 算法思路: 首先以一个元素为基准,从一个方向开始扫描,比如从左至右扫描,以a[0]为基准,接下来从a[0]...a[9] 中找出最小的元素,将其与a[0]交换,然后将基准位置右 移一位,重复上面的动作,比如,以a[1]为基准,找出a[1]至a[9]中最小的,将其与a[1]交换,一直进行到基准位置移到数组最后一个元素时排序结束(此时基准左边所有元素均递增有序,而基准为最后一个元素,故完成排序)。 4.直接插入排序算法 直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的,记录数增1的有序表。 一般情况下,第i趟直接插入排序的操作为: 在含有i-1个记录的有序子序列r[1...i-1]中插入一个记录r[i]后,变成含有i个记录的有序子序列r[1....i].在自i-1起往前搜索的过程中,可以同时后移记录。 整个排序过程为进行n-1躺插入,即: 先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止 三、程序源代码 1.二叉排序树的创建、遍历和查找删除算法 #include #include typedefintKeyType; typedefstructnode { KeyTypedata; structnode*lchild,*rchild; }LNode,*Tree; voidInsert(Tree&T,KeyTypekey) { if(! T) { T=newLNode; T->data=key; T->lchild=T->rchild=NULL; } else { if(key Insert(T->lchild,key); elseInsert(T->rchild,key); } } voidCreatTree(Tree&T)//二叉排序树的创建 { intnum; charc; while(scanf("%d",&num)) { Insert(T,num); c=getchar(); if(c=='\n') return; } } voidIn_Order(TreeT)//中序遍历 { if(T) { In_Order(T->lchild); printf("%d",T->data); In_Order(T->rchild); } } voidDelete(Tree&p) { Treeq,s; if(! p->rchild) { q=p; p=p->lchild; free(q); } elseif(! p->lchild) { q=p; p=p->rchild; free(q); } else { q=p; s=p->lchild; while(s->rchild) { q=s; s=s->rchild; } p->data=s->data; if(q! =p) q->rchild=s->lchild; else q->lchild=s->lchild; free(s); } } voidDelNode(Tree&T,KeyTypekey) { if(! T) { printf("\n该结点不存在\n"); return; } else { if(key==T->data) Delete(T); elseif(key DelNode(T->lchild,key); else DelNode(T->rchild,key); } } TreeSearch(TreeT,KeyTypekey)//二叉排序树查找 { if(! T) { printf("该结点不存在"); return0; } elseif(key==T->data) returnT; elseif(key return(Search(T->lchild,key)); elsereturn(Search(T->rchild,key)); } intmain()//主函数 { TreeT,p; T=NULL; KeyTypex; printf("请输入二叉树各结点: \n"); CreatTree(T); printf("中序遍历为: \n"); In_Order(T); printf("\n请输入要查找和删除的结点: \n"); scanf("%d",&x); p=Search(T,x); if(p) { DelNode(T,x); printf("中序遍历为: \n"); In_Order(T); } } 2、冒泡排序和折半查找算法 #include #include #defineM10 //冒泡排序 intBubbleSort(intc[]) { inti,t,j; for(i=0;i<9;i++) { for(j=0;j<9-i;j++) { if(c[j]>c[j+1]) { t=c[j]; c[j]=c[j+1]; c[j+1]=t; } } } printf("\n您所输入的数字的升序排列是: \n\n"); for(i=0;i<10;i++) { printf("%d",c[i]); printf(""); } return1; } //折半查找 intBinarySearch(intb[]) { intt,mid; inti=0; intj=9; printf("\n\n请输入您要查找的数字: "); scanf("%d",&t); while(i<=j) { mid=i+(j-i)/2; if(t==b[mid]) { printf("\n您要查找的数字的排列位置是: %d\n",mid+1); break; } elseif(t { j=mid-1; } else { i=mid+1; } } return1; } //主函数 intmain(intargc,char*argv[]) { inta[10]; printf("请您输入数据: \n\n"); for(inti=0;i<10;i++) { scanf("%d",&a[i]); } BubbleSort(a); BinarySearch(a); return0; } 3、简单选择排序和简单插入排序算法 #include intSelectionSort(int*a,intn) { inti,j,min,p,key,k; for(i=0;i {key=0; min=a[i]; for(j=i;j { if(a[j] {key=1;min=a[j];p=j;} } if(key==1) {a[p]=a[i]; a[i]=min; } for(k=0;k printf("%d",a[k]); printf("\n"); } return1; } intInserSort(int*a,intn) { inti,j,k; for(i=2;i<=n;i++) { a[0]=a[i]; for(j=1;j { if(a[j]>a[i]) {for(k=i;k>j;k--) a[k]=a[k-1]; a[k]=a[0]; break; } } for(j=1;j<=n;j++) { printf("%d",a[j]); } printf("\n"); } return1; } intmain() { inta[80],i,n,b; printf("请输入关键字的个数: "); scanf("%d",&n); printf("排序类型: \n"); printf("1.选择排序\n"); printf("2.插入排序\n"); printf("请选择: "); scanf("%d",&b); switch(b){ case1: printf("请输入关键字: \n"); for(i=0;i { scanf("%d",&a[i]); } printf("选择排序的流程以及结果: \n"); SelectionSort(a,n); return1; break; case2: printf("请输入关键字: \n"); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } printf("插入排序的流程以及结果: \n"); InserSort(a,n); return1; break; }while(a! =0); } 四、实验运行结果 1.二叉排序树的创建、遍历和查找删除算法 2、冒泡排序和折半查找算法 3、简单选择排序和简单插入排序算法 七、心得体会 通过本次的数据结构课程设计报告,掌握了查找和排序的几种基本排序算法,了解了他们各自的特点和优缺点,完成了对于他们C语言的描述和实际应用,对他们有了一个更加具体、深刻的认识,同时也锻炼了我们的逻辑思维能力和动手实践能力,使我们受益匪浅,给我们今后的计算机专业课程学习带来很大的帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 查找 排序