广州大学学生实验报告
开课实验室:计算机科学与工程实验(电子楼417) 2018年06月13日
学院 |
计算机科学与教育软件学院 |
年级、专业、班 |
网络161 |
姓名 |
卟咚君 |
学号 |
1606100*** |
|
实验课程名称 |
数据结构实验 |
成绩 |
|
|||||
实验项目名称 |
实验五 查找算法 |
指导老师 |
** |
|||||
一、实验目的 掌握线性的定义及基本操作,用链表实现:遍历、查找、插入、删除、翻转。 二、使用仪器、器材 微机一台 操作系统:WinXP 编程软件:C++ 三、实验内容及原理 实验内容: 顺序查找:使用数组或链表结构。用随机函数生成16个不重复的小写字母(’a’~’z’),键盘输入待查找的字母,返回查找成功与否,若成功则返回该字母所在的位置(序号),并计算比较次数。 折半查找:用数组实现,查找前元素先排序。计算比较次数。分别用查找成功、不成功进行测试。 二叉查找树(选做):手工输入10个字母,生成一棵二叉查找树,用递归算法打印树结构或分别输出先序和中序遍历序列以确认其结构。键盘输入待查找的字母,计算比较次数。分别用查找成功、不成功进行测试。 思路: 在顺序查找中,主要通过search(char *a, int len, char x) 函数中对全部的数组元素从头到位进行地毯式的查询,当成功查找到时返回下标,查找失败时返回-1.时间复杂度为O(n); 在折半查找中,主要先通过快速排序对随机数组的元素进行排序,排序结果为升序,然后在进行折半查找。在折半查找区间[l,r]中,每次要查找的值与当前的mid=(l+r)>>1进行比较,相等则输出下标,小于当前值则在[l,mid-1]中查找,大于下标为mid的值,则在[mid+1,r]中查找,知道找到或者l>r值则结束查找。快速排序需要时间复杂度为O(nlog2(n)),单次查找需要时间复杂度为O(log2(n)); 在二叉查找树中,先输入一个有序数组,然后生成一棵二叉排序树,按照树的凹入表示法输出这课二叉排序树,输出这课二叉排序树的先序,中序,后序遍历以及树的深度,叶子结点总数和结点的总数。最后进行查询。对于每一个查询,先与当前根结点比较,相等则输出结点的指针,小于则递归查询当前根结点的左子树,大于则查询当前根结点的右子树。 #include <iostream> #include<ctime> using namespace std; const int maxn = 1000 + 10; int compare_cnt; int search(char *a, int len, char x) //顺序查找 { int i; compare_cnt = 0; for (i = 0; i < len; i++) { compare_cnt++; if (x == a[i]) return i; // 返回元素的下标 } return -1; // 没有找到 } int binarySearch(char*a, int len, char x) //二分查找 { int mid; // 中间下标 int low = 0; // 区间的左端下标 int high = len - 1; // 区间的右端下标 compare_cnt = 0; while (low <= high) { compare_cnt++; mid = low + (high - low) / 2; // 计算中间下标, 若使用(low+high)/2可能会有整数溢出:当low和high的值较大时(接近整型数所能表示的范围),low+high的值就会溢出 if (x == a[mid]) return mid; // 若找到返回元素的下标 else if (x > a[mid]) low = mid + 1; // 在右半边区间搜索 else high = mid - 1; // 在左半边区间搜索 } return -1; // 没有找到 } void quickSort(char *a, int left, int right){ //快速排序 int i = left; int j = right; int temp = a[left]; if (left >= right) return; while (i != j) { while (i<j&&a[j] >= temp) j--; if (j>i) a[i] = a[j];//a[i]已经赋值给temp,所以直接将a[j]赋值给a[i],赋值完之后a[j],有空位 while (i<j&&a[i] <= temp) i++; if (i<j) a[j] = a[i]; } a[i] = temp;//把基准插入,此时i与j已经相等R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys quickSort(a, left, i - 1);//递归左边 quickSort(a, i + 1, right);//递归右边 } int main(){ char str[maxn]; int vis[maxn]; memset(vis, 0, sizeof(vis)); time_t t; srand((unsigned)time(&t)); //由时间确定随机序列,执行一次 int n, cnt = 0; cout << "请输入数组的元素的个数:"; //(1)请输入随机数组的元素个数 cin >> n; while (cnt <= n - 1){ //(2)生成n个随机元素,并且唯一 char c = char(rand() % 26 + 'a'); if (vis[c - 'a'] == 0){ vis[c - 'a'] = 1; str[cnt++] = c; } } cout << "生 成 的随机元素为:"; for (int i = 0; i<n; i++) //(3)将生成的n个随机元素输出 printf("%c%c", str[i], i == n - 1 ? '\n' : ' '); & |