浙江财经学院数据结构排序实验
更新时间:2023-12-20 00:24:01 阅读量: 教育文库 文档下载
实 验(实训)报 告
项 目 名 称 各种排序算法时间复杂度测试 所属课程名称 数据结构 项 目 类 型 综合实验 实验(实训)日期 2012年11月21日—30日
班 级 学 号 姓 名 指导教师 万贤美
浙江财经学院教务处制
第7章实验 排序算法时间效率测试
实验类型:综合型
实验目的:
1. 理解排序算法的基本思路; 2. 掌握排序算法的设计与实现;
3. 学会运用相关函数和工具测试算法时间耗费。
实验要求:
1. 认真阅读课本关于各种排序算法的思路,掌握分析排序算法的图示方法;
2. 设计算法测试程序,用六种排序算法分别对随机产生的数据进行排序,记录时间耗费; 3. 对实验结果进行处理与分析。
实验任务: 1、 以学生本人的学号为工程名,建立一个win32 console application工程。 2、 3、 4、
设计直接插入排序、冒泡排序、快速排序、简单选择排序算法,每个算法用一个函数实现;(选做:二分法插入排序)
对于两种数据规模n=10000和n=100000,随机产生十组整数,对于每一组数据,分别运用各种排序算法进行排序,记录其时间耗费(时间为秒); 实验报告要求:
(1) 把完成本实验的程序粘贴在后面; (2) 根据上述记录数据进行计算与分析
(a) 对于每一种算法,统计排序过程中比较和移动的次数,并通过两种不同数据规模的
时间耗费,验证其时间复杂度,要求用表格、文字进行说明。
(b) 根据(1)的计算结果,从算法时间效率、程序复杂性三个方面,对各种排序算法进
行比较,要求设计合适的表格进行数据比较,并对分析结果进行文字说明。
测试程序说明:(1)使用该排序算法,每一组数据排序时间约需要10秒以上,请耐心等待。(2)测试程序运用了C++提供的机器时钟读数函数clock(),该函数返回机器钟当前的振动次数。
#include
#define N 100000 void main() { int *a=new int[N]; //堆分配大规模内存
int *b=new int[N]; //堆分配大规模内存
clock_t start, finish; //记录排序前后的时间。clock_t是“机器钟”类型
2
double duration; //排序花费的时间
srand( (unsigned)time( NULL )+ 学号 ); //产生随机数种子
for (int k=1; k<=10; k++) { //产生十组随机数 for (int i=0; i start = clock(); //记录排序开始时的机器时间 //以下调用第一个排序算法,对N个数排序 //…… finish = clock(); //记录排序结束时的机器时间 duration = (double)(finish - start); //单位为毫秒 cout<<\ //输出排序花费的时间 //以下调用第二个排序算法,对N个数排序 // 把数组b中的数据转入至数组a for (int i=0; i start = clock(); //记录排序开始时的机器时间 // 调用排序算法…… finish = clock(); //记录排序结束时的机器时间 duration = (double)(finish - start); //单位为毫秒 //输出排序花费的时间 cout<<\ //完成其它排序算法的测试 ……… } delete []a; delete []b; } 实验报告写在后页 3 比较次数,移动次数程序 int CompareNum1; int MoveNum1; //直接插入排序,数组data用于存放待排序元素,n为待排序元素个数 template void InsertSort(ElemType data[],int n) { CompareNum1=0; MoveNum1=0; ElemType tmp; int i,j; for(i=1;i int CompareNum2; int MoveNum2; //冒泡排序 template 4 void BubbleSort(ElemType data[],int n) { CompareNum2=0; MoveNum2=0; int lastSwapIndex=n-1; int i,j; for (i = lastSwapIndex; i > 0;i = lastSwapIndex) { lastSwapIndex = 0; for (j = 0; j < i; j++){ if (data[j] > data[j + 1]){ Swap( data[j],data[j + 1]); lastSwapIndex = j; MoveNum2+= 3; } CompareNum2++; } } } //交换函数 template T c=a; a=b; b=c; } int CompareNum3; int MoveNum3; //快速排序 template int Partition(ElemType data[] , int low , int high) { CompareNum3=0; MoveNum3=0; ElemType pivot = data[low]; while (low < high){ while (low < high && data[high] >= pivot){ 5 high--; CompareNum3++; } CompareNum3++; data[low] = data[high]; while (low < high && pivot >= data[low]){ low++; CompareNum3++; } CompareNum3++; data[high] = data[low]; MoveNum3+= 2; } data[low] = pivot; MoveNum3 += 2; return low; } template void QuickSort(ElemType data[], int begin, int end) { if (begin >= end) return; int pivot = Partition(data , begin , end); QuickSort(data , begin , pivot - 1); QuickSort(data , pivot + 1, end); } template void QuickSort(ElemType data[], int n) { if (n < 2) return; CompareNum3 = MoveNum3 = 0; QuickSort(data, 0, n-1); } 6 int CompareNum4; int MoveNum4;// 简单选择排序 template void SelectionSort(ElemType data[], int n) { CompareNum4=0; MoveNum4=0; int i, j, min; for (i = 0; i < n; i++){ min = i; for (j = i + 1; j < n; j++){ if ( data[j] < data[min]) min = j; CompareNum4++; } Swap(data[i],data[min]); MoveNum4 += 3; } } #include void main() { // int CompareNum1,MoveNum1,CompareNum2,MoveNum2,CompareNum3,MoveNum3,CompareNum4,MoveNum4; int a[10]={1,9,3,7,25,48,21,5,8,10}; int n=10,i; cout<<\ for(i=0;i 7 InsertSort(a,n); BubbleSort(a,n); QuickSort(a,n); SelectionSort(a,n); cout<<\ for(i=0;i cout<<\冒泡排序比较次数=\移动次数=\ cout<<\快速排序比较次数=\移动次数=\ cout<<\简单选择排序比较次数=\移动次数=\} 时间复杂度比较程序 //InsretSort.h //直接插入排序 template void InsertSort(ElemType data[],int n) { ElemType tmp; int i,j; for(i=1;i 8 data[j]=data[j-1]; //元素后移 } data[j]=tmp; } } //BubbleSort.h //冒泡排序 template void BubbleSort(ElemType data[],int n) { int lastSwapIndex=n-1; int i,j; for( i=lastSwapIndex;i>0;i=lastSwapIndex ) { lastSwapIndex=0; for(j=0;jdata[j+1]) { Swap(data[j],data[j+1]); lastSwapIndex=j; } } } } //交换函数 template T c=a; a=b; b=c; } 9 // Partition.h //快速排序 template int Partition(ElemType data[] , int low , int high) { ElemType pivot = data[low]; while (low < high){ while (low < high && data[high] >= pivot) high--; data[low] = data[high]; while (low < high && pivot >= data[low]) low++; data[high] = data[low]; } data[low] = pivot; return low; } template void QuickSort(ElemType data[], int begin, int end) { if (begin >= end) return; int pivot = Partition(data , begin , end); QuickSort(data , begin , pivot - 1); QuickSort(data , pivot + 1, end); } template void QuickSort(ElemType data[], int n) { if (n < 2) return; QuickSort(data, 0, n-1); } // SelectionSort.h // 简单选择排序 10 template void SelectionSort(ElemType data[], int n) { int i, j, min; for (i = 0; i < n; i++){ min = i; for (j = i + 1; j < n; j++){ if ( data[j] < data[min]) min = j; } Swap(data[i],data[min]); } } //Main.cpp #include #define N 100000000 void main() { int n=100000; int *a=new int[N]; //堆分配大规模内存 int *b=new int[N]; //堆分配大规模内存 clock_t zjcrstart, zjcrfinish,mpstart, mpfinish,ksstart, ksfinish,jdxzstart,jdxzfinish; 记录排序前后的时间。clock_t是\机器钟\类型 double zjcrduration,mpduration,ksduration,jdxzduration; //排序花费的时间 //产生随机数种子 srand( (unsigned)time( NULL )+ 110104200145 ); for (int k=1; k<=10; k++) { //产生十组随机数 for (int i=0; i 11 // { b[i]=a[i]=rand(); //产生N个随机数, a数组用于排序,b数组用于保留原始数据 } zjcrstart = clock(); //记录排序开始时的机器时间 //以下调用第一个排序算法,对N个数排序 cout<<\ for(int j=0;j 12 a[w]=b[w]; } ksstart = clock(); //记录排序开始时的机器时间 // 调用排序算法…… QuickSort(a,n); ksfinish = clock(); //记录排序结束时的机器时间 ksduration = (double)(ksfinish - ksstart); //单位为毫秒 cout<<\快速排序花费的时间 = \//输出排序花费的时间 //简单选择排序 for (int e=0; e 以a[10]={1,9,3,7,25,48,21,5,8,10}为例 直接插入排序 冒泡排序 快速排序 简单选择排序 比较次数 13 9 3 45 移动次数 28 0 4 30 13 经过比较发现,当规模不断增加时,各种算法之间的差别是很大的。这六种算法中,快速排序比较和移动的次数是最少的,也是最快的一种排序方法。直接选择排序虽然交换次数很少,但比较次数较多. 以n=100000为例: 14 当数据规模很大时,冒泡排序花费的时间最多,快速排序花费的最少。 15
正在阅读:
浙江财经学院数据结构排序实验12-20
关于阿根廷,巴西的投资环境分析04-24
2019届九年级数学上册第四章图形的相似测评新版北师大版03-16
第五章 数据库设计基础分析06-01
最新小学英语教师的个人教学工作总结05-10
Novel Aspects in p-Brane Theories Weyl-Invariant Light-Like Branes08-20
第二章参考答案11-14
2022-2022学年人民版必修一 专题六 二 卓尔不群的雅典 作业04-16
共青团团员代表大会开幕词02-19
湿式除尘器总结12-02
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 数据结构
- 浙江
- 排序
- 实验
- 学院
- 财经
- 初中数学课堂教学设计评析
- AspNetPager与gridview结合实现分页
- 旅游资源开发问题
- 成为策划高手的必读策划书籍 doc
- 电子影像平台客户端安装手册规范 - 图文
- 危险源(危害因素)调查辨识、风险评价表
- 八下数学《同步练习》7.2统计表、统计图的选用(1)
- 20120224全路运输工作会议汇报材料
- 中国十大名园之扬州个园 - 图文
- 夏令营注意事项 - 图文
- 2011年合肥市高三第一次调研考试生物试题 - 图文
- 高一化学第一学期期末调研试卷1
- 电工实习报告(调光灯)
- 通航小知识:中国私人飞行培训机构大对比
- 安康杯心得体会
- 四年级日记:时间都去哪儿了1500字
- 计算机操作系统试题
- 2014年房产经纪人反省自己的每日一讲(2月17日)
- 《南京大屠杀》教学设计
- 生物化学试题库及其答案蛋白质的生物合成