数据结构实验报告-排序
[toc]
一、实验目的
- 学习各种排序的基本原理,并能计算各种排序的时间复杂度
- 能使用c/c++实现快速排序,并记录运行时间
二、实验环境
三、实验内容
- 用随机函数产生 10000(或更多)个整数(或浮点数),保存在文件(intfile.dat / realfile.dat)中
- 然后将文件中的所有整数(或浮点数)读入一个数组 a。用快速排序算法对上述数组 A中的数据进行排序
- 输出排序过程中元素的比较次数、交换(移动)次数,以及排序过程所消耗的时间(以 s 或 ms 为单位)
四、实验问题
- while循环内交换顺序错误,应该先右–,然后将右边的元素放到左边。对利用key多出来的空位的做法还是不太熟悉。
- while判断时写了等号,导致死循环。
五、数据结构
数组,存放整型待排数据。
六、算法及代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include <iostream> #include <fstream> #include <string> #include <cstdlib> #include <ctime>
using namespace std;
int a[10007]; int size; int compTimes = 0; int swapTimes = 0;
void createdata() { string path = "random.txt"; ofstream f(path); srand((unsigned) time(0)); for (int i = 0; i < 10000; ++i) { f << rand() << endl; } }
void readdata(string path) { ifstream f(path); for (size = 0; !f.eof(); size++) { f >> a[size]; } size--; }
void quicksort(int left, int right) { if (left >= right) return; int l = left, r = right; int key = a[left]; while (l < r) { while (l < r && a[r] >= key) r--, compTimes++; a[l] = a[r], swapTimes++; while (l < r && a[l] <= key) l++, compTimes++; a[r] = a[l], swapTimes++; } a[l] = key; quicksort(left, l - 1); quicksort(r + 1, right); }
void print() { cout << a[0]; for (int i = 1; i < size; i++) { cout << " " << a[i]; } cout << endl; }
int main() { clock_t start, end; string path = "/home/hjy/CLionProjects/数据结构实验-排序/random.txt"; readdata(path); print(); start = clock(); quicksort(0, size - 1); end = clock(); print(); cout << "比较次数: " << compTimes << endl; cout << "移动次数: " << swapTimes << endl; cout << "用时:" <<(double)( end - start )/CLOCKS_PER_SEC<< " s" << endl; return 0; }
|
七、运行结果
八、实验小结
在这次实验中,我学会了快速排序算法的原理,能使用c++代码实现,并能统计比较次数,交换次数,以及计算时间复杂度。而且,我还学会了用ctime中的clock记录程序运行的时间。收获颇丰。