1、数据结构试验报告各种内排序算法的实现及性能比较实 验 报 告( 2010 / 2011 学年 第 2 学期)课程名称数据结构使用C+语言描述实验名称各种内排序算法的实现及性能比较实验时间2011年5月27日指导单位计算机科学与技术系指导教师学生姓名班级学号学院(系)专 业实验名称各种内排序算法的实现及性能比较指导老师实验类型设计实验学时4实验时间2011.5.27一实验目的和要求内容:验证教材的各种内排序算法。分析各种排序算法的时间复杂度。要求:使用随机数产生器产生大数据集合,运行上述各种排序算法,使用系统时钟测量各算法所需的实际时间,并进行比较。二实验环境(实验设备)Visual C+6.0
2、三实验原理及内容/selectsort.h#include /简单选择排序template void SelectSort(T A, int n) int small; for (int i=0; in-1; i+) /执行n-1趟 small=i; for(int j=i+1;jn;j+) if(AjAsmall)small=j; Swap(Ai,Asmall); Insertsort.h#include /直接插入排序template void InsertSort(T A, int n) for(int i=1; i0&tempAj-1) Aj=Aj-1;j-; Aj=temp; /*o
3、k!*/Bubblesort.h#include template void BubbleSort(T A, int n) int i,j,last; i=n-1; while(i0) last=0; for(j=0;ji;j+) if(Aj+1Aj) Swap(Aj,Aj+1); last=j; i=last; Quicksort.h#include /改进的快速排序templatevoid quick(T A,int n) int *a; /用数组保存待排序的子序列的上、下界 int top=0,right,left,j; /left和right为待排序 a=new intn; if(a=
4、NULL) return; atop+=0; atop+=n-1; /以初始序列为待排序序列开始改进的快速排序 /lc for(j=0;aj!=NULL;j+) /循环到数组元素为空 left=aj+; right=aj; /每次按序从数组中取出两个元素作为待排序序列的上、下界 if(leftright) Swap(left,right); /如果下界大于上界,交换上、下界 if(right-left15) InsertSortExt(A,left,right); /若元素较少调用插入排序 else atop+=left; atop+=QuickSort(A,left,right)-1; at
5、op+=atop-2+2; atop+=right; /否则将低、高端序列上、下界依次保存到数组中 templateint QuickSort(T A,int left,int right) /用于改进的快速排序的原始快速排序方法 int i,j; if(leftright) i=left;j=right+1; do do i+;while(AiAleft); if(ij)Swap(Ai,Aj); while(ij); Swap(Aleft,Aj); return j; return 0;templatevoid InsertSortExt(T A,int left,int right)/用于
6、快速排序的直接插入排序方法 for(int i=left+1; i0 & tempAj-1) /从后往前查找插入位置 Aj=Aj-1; j-; /Aj-1元素后移,j指针前移 Aj=temp; /待插入元素存入找到的插入位置 Mergesort.h#include /两路合并的C+程序template void Merge(T A,int i1,int j1,int i2,int j2) / i1,j1是子序列1的下、上界,i1,j2是子序列2的下、上界 T *Temp=new Tj2-i1+1; /分配能存放两个子序列的临时数组 int i=i1,j=i2,k=0; /i,j是两个子序列的游
7、动指针,k是Temp的游动指针 while(i=j1&j=j2) if(Ai=Aj)Tempk+=Ai+; else Tempk+=Aj+; while(i=j1)Tempk+=Ai+; while(j=j2)Tempk+=Aj+; for(i=0;ik;i+)Ai1+=Tempi; delete Temp; /合并排序的C+程序template void MergeSort(T A, int n) int i1,j1,i2,j2; /i1,j1是子序列1的下、上界,i2,j2是子序列2的下、上界 int size=1; /子序列中元素个数,初始化为1。 while(sizen) i1=0;
8、while(i1+sizen-1) j2=n-1; else j2=i2+size-1; Merge(A,i1,j1,i2,j2); i1=j2+1; size*=2; Heapsort.h#include /AdjustDown函数template void AdjustDown(T A, int r, int j) int child=2*r+1; T temp=Ar; while(child=j) if(childj)&(Achild=Achild)break; A(child-1)/2=Achild; child=2*child+1; A(child-1)/2=temp;/堆排序的C+
9、程序template void HeapSort(T A, int n) for(int i=(n-2)/2; i-1; i-) AdjustDown(A,i,n-1); /构造最大堆 for(i=n-1; i0; i-) Swap(A0,Ai); AdjustDown(A,0,i-1); Meau.h#include #include #include #include #include selectsort.h#include insertsort.h#include bubblesort.h#include quicksort.h#include mergesort.h#include
10、heapsort.h#define SIZE 400#define TIMES 1000template class Menupublic: void printmenu(); void selectsort();/简单选择排序 void insertSort();/直接插入排序 void bubbleSort();/冒泡排序 void quickSort();/快速排序 void mergeSort();/两路合并排序 void heapSort();/堆排序 void childmenu();/子菜单1 void childmenu2();/子菜单2 void switcha();priv
11、ate: int a,b,c;template void Menu:printmenu() cout-endl; cout 内排序测试系统 endl; cout-endlendlendl; cout1.简单选择排序endl;/ok cout2.直接插入排序endl;/ok cout3.冒泡排序endl;/ok cout4.快速排序endl;/ok cout5.两路合并排序endl;/ok cout6.堆排序endl;/ok cout7.退出endl; coutPS:测试用的数组元素为SIZE时间为重复运行TIMES次的时间(包括了产生数据与析构的时间)switcha();template vo
12、id Menu:childmenu() cout-endl; cout1.最好情况endl; cout2.最坏情况endl; cout3.平均情况endl; cout4.返回主菜单b; if(b=4)this-printmenu();templatevoid Menu:childmenu2() cout-endl; cout1.原始算法endl; cout2.改进算法endl; cout3.返回主菜单c; if(c=3)this-printmenu();template void Menu:switcha() /coutoka; switch(a) case 1:this-selectsort
13、();break;/ok case 2:this-insertSort();break;/ok case 3:this-bubbleSort();break;/ok case 4:this-quickSort();break;/ok case 5:this-mergeSort();break;/ok case 6:this-heapSort();break;/ok case 7:exit(1);break; default:couterrorprintmenu();break; ;template void printout(T A,int n)/打印数组,测试时用 for(int i=0;i
14、n;i+) coutAi ; coutendl;template T *producedate(int x)/产生顺序,逆序,随机的数组 int i; T *A=new TSIZE; switch(x) case 1: for(i=0;i0;i-)Ai-1=SIZE-i;return A;/逆序 break; case 3:srand(time(NULL); for(i=0;iSIZE;i+)Ai=rand()%1000+1;return A;/随机 break; default: couterrorendl;return A;break; template void Swap(T &a,T
15、&b)/交换2个元素 T temp=a; a=b; b=temp;template void Menu:bubbleSort() cout冒泡排序childmenu(); T *A; double duration; clock_t start,finish; start=clock(); coutokendl; for(int i=0;iTIMES;i+) A=producedate(b); BubbleSort(A,SIZE); delete A; finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; /printo
16、ut(A,SIZE); cout用时: durationbubbleSort(); /*ok*/template void Menu:heapSort() cout堆排序endl; cout直接用随机数据测试endl; T *A; double duration; clock_t start,finish; start=clock(); coutokendl; for(int i=0;iTIMES;i+) A=producedate(3); HeapSort(A,SIZE); delete A; finish=clock(); duration=(double)(finish-start)/C
17、LOCKS_PER_SEC; cout用时: durationprintmenu(); template void Menu:insertSort() cout直接插入排序childmenu(); T *A; double duration; /A=producedate(b); /if(A=NULL)coutinsertSort(); /printout(A,SIZE); clock_t start,finish; start=clock(); coutokendl; for(int i=0;iTIMES;i+) A=producedate(b); InsertSort(A,SIZE); d
18、elete A; finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; /printout(A,SIZE); cout用时: durationinsertSort(); template void Menu:mergeSort() /this-childmenu(); cout合并排序endl; cout直接用随机数据测试endl; T *A; double duration; clock_t start,finish; start=clock(); coutokendl; for(int i=0;iTIMES;i+)
19、A=producedate(3); MergeSort(A,SIZE); delete A; finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; /printout(A,SIZE); cout用时: durationprintmenu(); /*ok*/templatevoid Menu:quickSort() this-childmenu2(); T *A; double duration; clock_t start,finish; if(c=1) cout原始快速排序endl; cout直接用随机数据测试endl
20、; start=clock(); coutokendl; for(int i=0;iTIMES;i+) A=producedate(3); QuickSort2(A,SIZE); delete A; finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; cout用时: durationquickSort(); else if(c=2) cout改进的快速排序endl; cout直接用随机数据测试endl; /*A=producedate(3); printout(A,SIZE); quick(A,SIZE); print
21、out(A,SIZE); delete A; this-printmenu(); */ /T *A; start=clock(); coutokendl; for(int i=0;iTIMES;i+) A=producedate(3); quick(A,SIZE); delete A; finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; cout用时: durationquickSort(); elsecouterrorprintmenu();template void Menu:selectsort() /this-
22、childmenu(); cout简单选择排序endl; cout直接用随机数据测试endl; T *A; double duration; clock_t start,finish; start=clock(); coutokendl; for(int i=0;iTIMES;i+) A=producedate(3); SelectSort(A,SIZE); delete A; finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; /printout(A,SIZE); cout用时: durationprintmenu(); /*ok!*/Mymain.cpp#include Menu.hint main() Menu MenuObj; MenuObj.printmenu();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1