广州大学学生实验报告
开课实验室:计算机科学与工程实验(电子楼417) 2018年06月13日
学院 |
计算机科学与教育软件学院 |
年级、专业、班 |
网络161 |
姓名 |
卟咚君 |
学号 |
1606100*** |
|
实验课程名称 |
数据结构实验 |
成绩 |
|
|||||
实验项目名称 |
指导老师 |
** |
||||||
一、实验目的 加强对多种排序算法的理解 二、使用仪器、器材 微机一台 操作系统:WinXP 编程软件:C++ 三、实验内容及原理 实验内容:用随机函数生成16个2位正整数(10~99),从复杂度为O(n2) 的插入排序、选择排序、冒泡(双向冒泡)和复杂度为O(nlog2n) 的堆排序、快速排序、归并排序等多种排序算法各选1种实现,输出排序中间过程、统计关键字的比较次数和记录的移动次数。 思路:用随机函数rand() % 90 + 10生成16个2位正整数(10~99),使用时间复杂度为O(n2) 的冒泡排序对生成16个2位正整数进行排序。冒泡排序:在每一轮的排序中,通过相邻的两个数的比较, 根据需要决定是否将两个数互换位置, 然后将比较往前(或往后)推进. 这一轮循环结束后最值将会置于顶端。使用时间复杂度为O(nlog2n)的快速排序对生成16个2位正整数进行排序。快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。另外还可以使用基数排序对生成16个2位正整数进行排序。基数排序(radix sort)属于“分配式排序”,基数排序的总体思路就是将待排序数据拆分成多个关键字进行排序,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O(d(n+rd)),其中d为所采取的基数,而r为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。在本次实验内容中,使用d=2,r=10,使用基数排序解决本次实验内容问题的时间复杂度为O(n),比前面的两种算法都要快和稳定。 #include<iostream> #include<bits/stdc++.h> using namespace std; const int maxn = 10000 + 10; /* *冒泡排序 *在每一轮的排序中,通过相邻的两个数的比较, 根据需要决定是否将两个数互换位置, 然后将比较往前(或往后)推进. 这一轮循环结束后最值将会置于顶端 */ int cnt_compare, cnt_move; void bubblesort(int *arrayVal, int length) { int i, j; int temp; for (i = 0; i<length - 1; i++) { bool flag = false; //减枝,标记数组的元素是否在下一轮比较中发生交换,如果没有可以提前结束排序 for (j = i + 1; j<length; j++) { cnt_compare++; if (arrayVal[i]>arrayVal[j]) { cnt_move++; flag = true; temp = arrayVal[i]; //置换位置 arrayVal[i] = arrayVal[j]; |