1、数据结构实验 排序 实验报告学生姓名: 黄家明 学 号: 6103115017 专业班级: 计科151班 实验类型: 验证 综合 设计 创新 实验日期: 2017/5/24 实验成绩: 一、实验目的 深入了解各种内部排序方法及效率分析。二、问题描述 各种内部排序算法的时间复杂度分析,试通过随机数据比较算法的关键字比较次数和关键字移动次数。三、实验要求1、对起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序这六种常用排序算法进行比较。2、待排序表的表长不超过100;其中数据用伪随机数产生程序产生。1、 至少要用6组不同的输入数据做比较。2、 要对实验结果做简单分析。四、实验环境PC
2、微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、实验步骤 1、根据问题描述写出基本算法。 2、设计六种排序算法并用适当语言实现。 3、输入几组随机数据,并对其关键字比较次数和关键字移动次数的比较。 4、对结果进行分析。 5、进行总结。六、测试数据 数据有随机数产生器产生。七、实验结果随机数产生器产生器代码,利用rand(), srand()产生随机数#include using namespace std;int main() /测试数据输出到data.in文件中 freopen(/Users/huangjiaming/Docu
3、ments/Algorithm/src/data.in, w, stdout); int n; srand(unsigned)time(0); while (scanf(%d, &n) printf(%dn, n); for (int i = 0; i n; i+) printf(%d , rand()%10000); printf(n); return 0;冒泡排序的实现代码:void BubbleSort(int arr, int n) double start = clock(); printf(排序数据大小:%d, 冒泡排序后:n, n); for (int i = 0; i n; i
4、+) for (int j = i; j aj) ai = aj = ai = aj; double end = clock(); print(a, n); printf(冒泡排序花费的时间 = %.6lfsnn, (double)(end - start)/CLOCKS_PER_SEC);直接插入排序的实现代码:void insertsort(int arr, int n) double start = clock(); printf(排序数据大小:%d, 直接插入排序后:n, n); for(int i = 1;i n; i +) /0,i-1都是有序的。如果待插入元素比arri-1还大则
5、无需再与i-1前面的元素进行比较了,反之则进入if语句 if(arri = 0 & arrj temp; j-) arrj+1 = arrj; /把比temp大或相等的元素全部往后移动一个位置 arrj+1 = temp; /把待排序的元素temp插入腾出位置的(j+1) double end = clock(); print(a, n); printf(直接插入排序花费的时间 = %.6lfsnn, (double)(end - start)/CLOCKS_PER_SEC);简单选择排序的实现代码:void selectionSort(int arr,int n) double start
6、= clock(); printf(排序数据大小:%d, 简单选择排序后:n, n); for(int i = 0;i n; i+) int min = i; / 找出本轮中最小的位置 for(int j=i+1;jn;j+) if(arrj right) return; int temp = arrleft; /temp中为基准数 int i = left, j = right; while (i != j) /从右边开始找 while (arrj = temp & i j) j-; /再从左边开始找 while (arri = temp & i j) i+; if (i 0) /无序部分
7、for(int i = step; i = 0 & temp arrj; j = j - step) /在找到当前元素合适位置前,元素后移 arrj+step = arrj; arrj+step = temp; step /= 2; double end = clock(); print(a, n); printf(希尔选择排序花费的时间 = %.6lfsnn, (double)(end - start)/CLOCKS_PER_SEC);堆排序实现代码void adjustHeap(int arr, int p, int len) int curParent = arrp; int child
8、 = 2* p + 1; /左孩子 while(child len) /没有孩子 if(child+1 len & arrchild arrchild+1) child+; /较大孩子的下标 if(curParent=0; i-) adjustHeap(arr, i, len); for(int i = len -1; i=0; i-) int maxEle = arr0; arr0 = arri; arri = maxEle; adjustHeap(arr, 0, i); 实验过程如下,生成随机数,总共三组,数据大小分别为10、1000、100001、 冒泡排序测试排序消耗的时间分别为0.0
9、00025s、0.002381s、0.312073s,时间复杂度为O(n2)2、 直接插入排序测试排序消耗的时间分别为0.000086s、0.001031s、0.082690s,时间复杂度为O(n2)3、 简单选择排序测试排序消耗的时间分别为0.000025s、0.001450s、0. 135557s,时间复杂度为O(n2)4、 快速排序测试排序消耗的时间分别为0.000027s、0.00119s、0. 001427s,时间复杂度为O(n*log2n)5、 希尔排序测试排序消耗的时间分别为0.000067s、0.00167s、0. 002567s,时间复杂度不确定6、 堆排序测试排序消耗的时间分别为0.000024s、0.00118s、0. 001859s,时间复杂度O(n*log2n)八、问题以及思考经过实验,可以得出排序法最差时间分析平均时间复杂度稳定度空间复杂度冒泡排序O(n2)O(n2)稳定O(1)快速排序O(n2)O(n*log2n)不稳定O(log2n)O(n)选择排序O(n2)O(n2)稳定O(1)插入排序O(n2)O(n2)稳定O(1)堆排序O(n*log2n)O(n*log2n)不稳定O(1)希尔排序OO不稳定O(1) 而在实验结果中,对于数据比较大的测试,它们之间的排序效率差异较为明显。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1