1、基于交换类的排序有冒泡排序和快速排序。冒泡排序是比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。2.3基于选择类的排序概述选择排序的基
2、本思想是从每一趟待排序数据中选取一个关键字最小的记录,并置于适当的位置上。即第一趟从n个记录中选取关键字最小的记录,第二趟从剩下的n-1个记录中选取关键字最小的记录,直到整个序列的记录选完,由选取记录的顺序便可得到关键字有序的序列。堆排序的基本思想是通过类似于淘汰赛的想法,让序列中的关键字两两相比,不断淘汰较大者,最终选出关键字最小的记录。4、系统测试4.1基于线性表的查找源代码#includeprocess.h#define LIST_SIZE 100/定义顺序表的最大长度typedef int keyType ;/定义关键字类型为整形typedef struct keyType key ;
3、 /关键字项RecordType ;/记录类型 RecordType rLIST_SIZE+1; /r0用作监视哨 int length ; /定义顺序表长度RecordList ;/顺序表类型/*函数申明*/void CreatList(RecordList*L);int SeqSearch(RecordList*l,keyType k);int BinSrch(RecordList*l,keyType k);void Display(RecordList*L);void shunxu();void zheban();void Menu();/主函数int main() int i ; Me
4、nu(); printf(请选择:n); scanf(%d,&i); switch(i) case 1 : shunxu(); break ; case 2 : zheban(); case 3 : exit(1); default :输入命令错误,请重新输入! return 0 ;/创建线性表void CreatList(RecordList*L)请输入数据元素的个数:L-length);请输入数据元素: for(i=1;ilength;i+)ri);/*有哨兵的顺序查找*/int SeqSearch(RecordList*l,keyType k) l-r0.key=k ; i=l-leng
5、th ; while(l-ri.key!=k) i-; return i ;/*折半查找*/int BinSrch(RecordList*l,keyType k) int low,high,mid ; low=1 ; high=l- while(lowrmid.key) return mid ; else if(k high=mid-1 ; else low=mid+1 ;/*折半查找结果*/void zheban() int key ; RecordList l ;折半查找如下: CreatList(&l); Display(&n请输入关键字数据:key); if(BinSrch(&l,ke
6、y)关键字数据的位置是:%dn,BinSrch(&l,key);不存在这样的关键字!/*顺序查找结果*/void shunxu()顺序查找如下: if(SeqSearch(&,SeqSearch(&/输出线性表void Display(RecordList*L)数据集合输出:序号tt%dt,i);数据元素t,L-/程序菜单void Menu()/*基于线性表的查找*/* 1:顺序查找 */* 2:折半查找 */* 3:退出 */*/测试结果如下:4.2基于线性表的排序源代码#define MAXSIZE 100/定义顺序表的最大长度typedef int keyType;typedef str
7、uct keyType key;/关键字项RedType; RedType rMAXSIZE+1;/r0用作监视哨 int length;/定义顺序表长度SqList;/函数申明void CreateSqList(SqList *L);void InsertSort(SqList *L);void BInsertSort(SqList *L);void ShellInsert(SqList *L,int dk);void ShellSort(SqList *L,int dlta,int t);void BubbleSort(SqList *L);int Partition(SqList *L,
8、int low,int high);void QSort(SqList *L,int s,int t);void QuickSort(SqList *L);void SelectSort(SqList *L);void HeapAdjust(SqList *L,int s,int t);void HeapSort(SqList *L);void Display(SqList *L);int main() /主函数 int i; SqList l; int dlta3=5,3,1;/希尔排序的增量 Menu(); printf( scanf( switch(i) case 1: CreateSq
9、List(& Display(& InsertSort(& printf(直接插入排序输出: break; case 2: BInsertSort(&折半插入排序输出: case 3: ShellSort(&l,dlta,3);希尔排序输出: case 4: BubbleSort(&冒泡排序输出: case 5: QuickSort(&快速排序输出: case 6: SelectSort(&简单选择排序输出: case 7: HeapSort(&堆排序输出: case 0: exit(1); default: printf( break; Menu(); printf( scanf( retu
10、rn 0;void CreateSqList(SqList *L)/创建线性表 int i;void InsertSort(SqList *L)/直接插入排序 int i,j; for(i=2;+i) if(L-ri.keyr0=L-ri;ri=L-ri-1; for(j=i-2;r0.keyrj;r0;void BInsertSort(SqList *L)/折半插入排序 int i,j,low,high,m; low=1; high=i-1; m=(low+high)/2;rm.key) high=m-1; else low=m+1; for(j=i-1;j=high+1;rhigh+1=L
11、-void ShellInsert(SqList *L,int dk) /一趟希尔排序 for(i=dk+1;ri-dk.key) for(j=i-dk;0&(L-rj.key);j-=dk)rj+dk=L-void ShellSort(SqList *L,int dlta,int t)/希尔排序 int k; for(k=0;klength,j,temp; int lastExchangeIndex; while(i1) lastExchangeIndex=1; for(j=1;ji;j+)rj+1.keyrj+1.key;rj+1.key=L-rj.key=temp; lastExchan
12、geIndex=j; i=lastExchangeIndex;int Partition(SqList *L,int low,int high)/一趟快速排序寻找枢轴 int key; key=L-rlow.key;high)high&rhigh.key=key) -high;rlow.key=L-rhigh.key;rlow.keyrlow.key=key; return low;void QSort(SqList *L,int s,int t)/对区间s,t进行快速排序 int pivotloc=Partition(L,s,t); if(t-svoid SelectSort(SqList
13、*L) /简单选择排序 int i,j,temp,t; for(j=i+1,t=i; if(L-rt.key t=j; if(t!=i) temp=L-rt.key; L-rt.key=L-ri.key;ri.key=temp;void HeapAdjust(SqList *L,int s,int t) /堆的赛选 int j,key;rs.key; for(j=2*s;=t;j*=2) if(jt&rj.key break; L-rs.key=L- s=j;rs.key=key;void HeapSort(SqList *L) /对顺序表进行堆排序 int key,i; for(i=L-le
14、ngth/2;i0;i-) HeapAdjust(L,i,L-1;-i) key=L-r1.key;r1.key=L-ri.key=key; HeapAdjust(L,1,i-1);void Display(SqList *L) /输出线性表void Menu() /程序菜单/*基于线性表的各种排序*/ 1:直接插入排序n 2:折半插入排序n 3:希尔排序n 4:冒泡排序n 5:快速排序n 6:简单选择排序n 7:堆排序n 0:退出n/*/n4.3测试评价优点:此次做的基于线性表下的查找和排序系统,采用顺序存储结构,融合了各种查找和排序的算法,简单方便,执行效率高。不足与改进:此次课程设计由于
15、时间有限,查找法只做了基于线性表下的查找法,基于树的查找和计算式查找(Hash法查找)没有做,课外空余时间可以再去做做。对于排序也还有归并排序没有做,留到课外再完善吧。五、实习体会与总结经过这次数据结构的课程设计,首先使我对数据结构这门课更感兴趣,也对编程和这门课程有了更深入的体会和认知,数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。这门课对于计算机类的专业确实非常重要,起到举足轻重的作用,如果想干计算机这一行,那这门课一定要更深入的学习才行。其次,通过这次课程设计,让我对编程方面有了极大的进步,自己的程序调试能力也有了很大的提升,增加了自信。最后通过这次的课程设计,更是让我深刻认识到自己在学习中的不足,同时也找到了
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1