版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上实 验 报 告( 2010 / 2011 学年 第 2 学期)课程名称数据结构使用C+语言描述实验名称各种内排序算法的实现及性能比较实验时间2011年5月27日指导单位计算机科学与技术系指导教师学生姓名班级学号学院(系)专 业实验名称各种内排序算法的实现及性能比较指导老师实验类型设计实验学时4实验时间2011.5.27一实验目的和要求内容:验证教材的各种内排序算法。分析各种排序算法的时间复杂度。要求:使用随机数产生器产生大数据集合,运行上述各种排序算法,使用系统时钟测量各算法所需的实际时间,并进行比较。二实验环境(实验设备)Visual C+6.0三实验原理及内容/s
2、electsort.h#include <iostream.h>/简单选择排序template <class T>void SelectSort(T A, int n) int small;for (int i=0; i<n-1; i+) /执行n-1趟small=i;for(int j=i+1;j<n;j+)if(Aj<Asmall)small=j;Swap(Ai,Asmall);Insertsort.h#include <iostream.h>/直接插入排序template <class T>void InsertSort(
3、T A, int n) for(int i=1; i<n; i+) /执行n-1趟int j=i;T temp=Ai;while(j>0&&temp<Aj-1)Aj=Aj-1;j-;Aj=temp;/*ok!*/Bubblesort.h#include <iostream.h>template <class T>void BubbleSort(T A, int n) int i,j,last; i=n-1; while(i>0) last=0; for(j=0;j<i;j+) if(Aj+1<Aj) Swap(Aj,A
4、j+1); last=j; i=last; Quicksort.h#include <iostream.h>/改进的快速排序template<class T>void quick(T A,int n)int *a; /用数组保存待排序的子序列的上、下界int top=0,right,left,j; /left和right为待排序a=new intn;if(a=NULL) return;atop+=0;atop+=n-1; /以初始序列为待排序序列开始改进的快速排序/lcfor(j=0;aj!=NULL;j+) /循环到数组元素为空left=aj+;right=aj; /
5、每次按序从数组中取出两个元素作为待排序序列的上、下界if(left>right)Swap(left,right); /如果下界大于上界,交换上、下界if(right-left<15)InsertSortExt(A,left,right); /若元素较少调用插入排序elseatop+=left; atop+=QuickSort(A,left,right)-1;atop+=atop-2+2;atop+=right; /否则将低、高端序列上、下界依次保存到数组中template<class T>int QuickSort(T A,int left,int right) /用于
6、改进的快速排序的原始快速排序方法int i,j;if(left<right)i=left;j=right+1;dodo i+;while(Ai<Aleft);do j-;while(Aj>Aleft);if(i<j)Swap(Ai,Aj);while(i<j);Swap(Aleft,Aj);return j;return 0;template<class T>void InsertSortExt(T A,int left,int right)/用于快速排序的直接插入排序方法for(int i=left+1; i<right; i+) /执行n-1
7、趟int j=i;T temp=Ai; /待插入元素存入临时变量while (j>0 && temp<Aj-1) /从后往前查找插入位置Aj=Aj-1; j-; /Aj-1元素后移,j指针前移Aj=temp; /待插入元素存入找到的插入位置Mergesort.h#include <iostream.h>/两路合并的C+程序template <class T>void Merge(T A,int i1,int j1,int i2,int j2) / i1,j1是子序列1的下、上界,i1,j2是子序列2的下、上界T *Temp=new Tj2-i
8、1+1; /分配能存放两个子序列的临时数组int i=i1,j=i2,k=0; /i,j是两个子序列的游动指针,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;i<k;i+)Ai1+=Tempi;delete Temp; /合并排序的C+程序template <class T>void MergeSort(T A, int n)int i1
9、,j1,i2,j2; /i1,j1是子序列1的下、上界,i2,j2是子序列2的下、上界int size=1; /子序列中元素个数,初始化为1。while(size<n)i1=0;while(i1+size<n)i2=i1+size;j1=i2-1;if(i2+size-1>n-1)j2=n-1;else j2=i2+size-1;Merge(A,i1,j1,i2,j2);i1=j2+1;size*=2;Heapsort.h#include <iostream.h>/AdjustDown函数template <class T>void AdjustDow
10、n(T A, int r, int j) int child=2*r+1; T temp=Ar; while(child<=j)if(child<j)&&(Achild<Achild+1)child+;if(temp>=Achild)break;A(child-1)/2=Achild;child=2*child+1;A(child-1)/2=temp;/堆排序的C+程序template <class T>void HeapSort(T A, int n)for(int i=(n-2)/2; i>-1; i-) AdjustDown(A,
11、i,n-1); /构造最大堆for(i=n-1; i>0; i-)Swap(A0,Ai);AdjustDown(A,0,i-1);Meau.h#include <iostream.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include "selectsort.h"#include "insertsort.h"#include "bubblesort.h"#include "quicksort.h&q
12、uot;#include "mergesort.h"#include "heapsort.h"#define SIZE 400#define TIMES 1000template <class T>class Menupublic:void printmenu();void selectsort();/简单选择排序void insertSort();/直接插入排序void bubbleSort();/冒泡排序void quickSort();/快速排序void mergeSort();/两路合并排序void heapSort();/堆排序vo
13、id childmenu();/子菜单1void childmenu2();/子菜单2void switcha();private:int a,b,c;template <class T>void Menu<T>:printmenu()cout<<"-"<<endl;cout<<" 内排序测试系统 "<<endl;cout<<"-"<<endl<<endl<<endl;cout<<"1.简单选择
14、排序"<<endl;/okcout<<"2.直接插入排序"<<endl;/okcout<<"3.冒泡排序"<<endl;/okcout<<"4.快速排序"<<endl;/okcout<<"5.两路合并排序"<<endl;/okcout<<"6.堆排序"<<endl;/okcout<<"7.退出"<<endl;co
15、ut<<"PS:测试用的数组元素为"<<SIZE<<"时间为重复运行"<<TIMES<<"次的时间(包括了产生数据与析构的时间)"<<endl;this->switcha();template <class T>void Menu<T>:childmenu()cout<<"-"<<endl;cout<<"1.最好情况"<<endl;cout<
16、<"2.最坏情况"<<endl;cout<<"3.平均情况"<<endl;cout<<"4.返回主菜单"<<endl;cin>>b;if(b=4)this->printmenu();template<class T>void Menu<T>:childmenu2()cout<<"-"<<endl;cout<<"1.原始算法"<<endl;co
17、ut<<"2.改进算法"<<endl;cout<<"3.返回主菜单"<<endl;cin>>c;if(c=3)this->printmenu();template <class T>void Menu<T>:switcha()/cout<<"ok"<<endl;cin>>a;switch(a)case 1:this->selectsort();break;/okcase 2:this->insert
18、Sort();break;/okcase 3:this->bubbleSort();break;/okcase 4:this->quickSort();break;/okcase 5:this->mergeSort();break;/okcase 6:this->heapSort();break;/okcase 7:exit(1);break;default:cout<<"error"<<endl;this->printmenu();break;template <class T>void printout(
19、T A,int n)/打印数组,测试时用for(int i=0;i<n;i+)cout<<Ai<<" "cout<<endl;template <class T>T *producedate(int x)/产生顺序,逆序,随机的数组int i;T *A=new TSIZE;switch(x)case 1:for(i=0;i<SIZE;i+)Ai=i;return A;/顺序break;case 2:for(i=SIZE;i>0;i-)Ai-1=SIZE-i;return A;/逆序break;case 3:s
20、rand(time(NULL);for(i=0;i<SIZE;i+)Ai=rand()%1000+1;return A;/随机break;default:cout<<"error"<<endl;return A;break;template <class T>void Swap(T &a,T &b)/交换2个元素T temp=a;a=b;b=temp;template <class T>void Menu<T>:bubbleSort()cout<<"冒泡排序"&
21、lt;<endl;this->childmenu();T *A;double duration;clock_t start,finish;start=clock();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(b);BubbleSort(A,SIZE);delete A;finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;/printout(A,SIZE);cout<<
22、"用时: "<<duration<<endl;system("pause");/delete A;this->bubbleSort();/*ok*/template <class T>void Menu<T>:heapSort()cout<<"堆排序"<<endl;cout<<"直接用随机数据测试"<<endl;T *A;double duration;clock_t start,finish;start=cloc
23、k();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(3);HeapSort(A,SIZE);delete A;finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;cout<<"用时: "<<duration<<endl;system("pause");this->printmenu();template <
24、class T>void Menu<T>:insertSort()cout<<"直接插入排序"<<endl;this->childmenu();T *A;double duration;/A=producedate<T>(b);/if(A=NULL)cout<<"error"delete A;this->insertSort();/printout(A,SIZE);clock_t start,finish;start=clock();cout<<"ok&q
25、uot;<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(b);InsertSort(A,SIZE);delete A;finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;/printout(A,SIZE);cout<<"用时: "<<duration<<endl;system("pause");/delete A;this->insertSort();template
26、 <class T>void Menu<T>:mergeSort()/this->childmenu();cout<<"合并排序"<<endl;cout<<"直接用随机数据测试"<<endl;T *A;double duration;clock_t start,finish;start=clock();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(3
27、);MergeSort(A,SIZE);delete A;finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;/printout(A,SIZE);cout<<"用时: "<<duration<<endl;system("pause");/delete A;this->printmenu();/*ok*/template<class T>void Menu<T>:quickSort()this->childmenu
28、2();T *A;double duration;clock_t start,finish;if(c=1)cout<<"原始快速排序"<<endl;cout<<"直接用随机数据测试"<<endl;start=clock();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(3);QuickSort2(A,SIZE);delete A;finish=clock();duration=(
29、double)(finish-start)/CLOCKS_PER_SEC;cout<<"用时: "<<duration<<endl;system("pause");this->quickSort();else if(c=2)cout<<"改进的快速排序"<<endl;cout<<"直接用随机数据测试"<<endl;/*A=producedate<T>(3);printout(A,SIZE);quick(A,SIZE
30、);printout(A,SIZE);delete A;this->printmenu();*/T *A;start=clock();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(3);quick(A,SIZE);delete A;finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;cout<<"用时: "<<duration<<en
31、dl;system("pause");this->quickSort();elsecout<<"error"<<endl;this->printmenu();template <class T>void Menu<T>:selectsort()/this->childmenu();cout<<"简单选择排序"<<endl;cout<<"直接用随机数据测试"<<endl;T *A;double durat
32、ion;clock_t start,finish;start=clock();cout<<"ok"<<endl;for(int i=0;i<TIMES;i+)A=producedate<T>(3);SelectSort(A,SIZE);delete A;finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;/printout(A,SIZE);cout<<"用时: "<<duration<<endl;syste
33、m("pause");/delete A;this->printmenu();/*ok!*/Mymain.cpp#include "Menu.h"int main()Menu<int> MenuObj;MenuObj.printmenu();cout<<"ok end."<<endl;return 0;/*ok- 内排序测试系统-1.简单选择排序2.直接插入排序3.冒泡排序4.快速排序5.两路合并排序6.堆排序7.退出PS:测试用的数组元素为400时间为重复运行1000次的时间(包括了产生数据与析构的时间)ok1简单选择排序直接用随机数据测试ok用时: 0.593请按任意键继续. . .- 内排序测试系统-1.简单选择排序2.直接插入排序3.冒泡排序4.快速排序5.两路合并排序6.堆排序7.退出PS:测试用的数组元素为400时间为重复运行1000次的时间(包括了产生数据与析构的时间)ok2直接插入排序-1.最好情况2.最坏情况3.平均情况4.返回主菜单1ok用时: 0请按任意键继续. . .直接插入排序-1.最好情况2.最坏情况3.平均情况4.返回主菜单2ok用时: 0.703请按任意键继续. . .直接插入排序-1.最好情况2.最坏情况3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 扶余市招聘社区就业服务专员笔试真题2025
- 舞台灯光音响租赁合同(2026版)
- 信阳商城县选调城区义务教育学校教师笔试真题2025
- 吉林通化集安市社区就业服务专员招聘笔试真题2025
- 2026 年公路沿线塌方险情避让安全知识
- 2026 年秋季高二开学第一课高中生亲子之间有效沟通实操班会
- 2026年秋道德与法治三年级上册教学工作计划
- 《一景多拍:同一目的地用黑白、彩色、手机与无人机四种表达》
- 某汽车零部件厂生产安全准则
- 《文书与档案管理习题册》答案 - 模块1-5
- 2025年农信社不良资产处置岗招聘考试题库附答案
- 容县辅警招聘考试题库 (答案+解析)
- 2026年全国高考1卷高考数学真题(教师版)
- 煤矿安全生产标准化管理体系2024版与2026版对比分析报告
- 期末模拟测试卷(试卷)2025-2026学年五年级数学下册人教版(含答案)
- 1.1 动与静 课件(共28张)2026-2027学年沪科版物理八年级全一册
- 2026年五四制小升初数学测试题及答案
- 彭吉象《艺术学概论》100题-考研
- 质量保证体系图
- 合同条件中英文对照版
- 灾害(地震)外伤现场救护
评论
0/150
提交评论