本科课程【数据结构与算法】实验7 - 快速排序、折半查找
大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。
博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html
一、 实验目的
- 实现快速排序算法
- 实现折半查找算法
二、 实验内容
1. 实验任务
(1)输入一个数组,将数组元素用快速排序输出
(2)输入一个目标数据,从已知链表中用折半查找查出目标数据的位置
2. 程序设计
1) 数据输入(输入哪些数据、个数、类型、来源、输入方式)
输入n个需要排序的数据(int 整型)
输入待查找的目标数据key(int 整型)
2) 数据存储(输入数据在内存中的存储)
n个数据都存储在数组Array[i]中
以链表的形式存储数据,采用动态分配内存并释放
3) 数据处理(说明处理步骤。若不是非常简单,需要绘制流程图)
(1)
①先从数列中取出一个数为准基数
②分区过程,将比这个数大的数全部放在他的右边,小于或等于它的数全部放在左边
③再对左右区间重复第二步,直到各区间只有一个数
(2)
①将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
②否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表;
③重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
4) 数据输出
三、 实验环境
- 操作系统:WINDOWS 10
- 开发工具:VC++ 2013
- 实验设备:PC
源代码(C++实现)
快速排序
#includeusing namespace std;void QuickSort(int Array[], int left, int right);int main(){int array[] = { 3, 21, 87, 1, 21, 10 };cout << "排序前数列为:";for (int i = 0; i < 6; i++){cout<< array[i]<<" ";}cout << endl;QuickSort(array, 0, 5);cout << "快速排序后为:";for (int i = 0; i < 6; i++){cout << array[i]<<" ";}cout << endl;system("pause");return 0;}void QuickSort(int Array[], int left, int right){if (left >= right){return;}int first = Array[left];int leftIndex = left, rightIndex = right;while (leftIndex < rightIndex){while (leftIndex < rightIndex){if (first <= Array[rightIndex]){rightIndex--;}else{Array[leftIndex] = Array[rightIndex];leftIndex++;break;}}while (leftIndex < rightIndex){if (first >= Array[leftIndex]){leftIndex++;}else{Array[rightIndex] = Array[leftIndex];rightIndex--;break;}}}Array[leftIndex] = first;QuickSort(Array, left, leftIndex - 1);QuickSort(Array, rightIndex + 1, right);}
折半查找
#includeusing namespace std;// 线性表中的元素typedef int KeyType;typedef struct ElemType {KeyType key;// 主关键字// 省略其他数据,不再定义}ElemType;// 线性表的顺序存储结构typedef struct SeqTable {ElemType* elem;// 数据元素存储空间基址,建表时按实际长度分配,// 0 号单元留空,从 1 号单元开始使用。int length;// 表长度}SeqTable;//// 在此处声明函数//int BinarySearch(SeqTable* pST, KeyType key);void InitSeqTable(SeqTable* pST);void DeleteSeqTable(SeqTable* pST);int main(){KeyType n,m;SeqTable ST;// 线性表//// 初始化线性表//InitSeqTable(&ST);cout << "初始线性表为:";for (int i = 1; i <= ST.length; i++){cout << ST.elem[i].key << " ";}cout << endl;cout << "输入要查找的元素:";cin >> n;//// 折半查找//m=BinarySearch(&ST, n);cout << n << "位于链表的第" << m << "位" << endl;//// 销毁线性表//DeleteSeqTable(&ST);system("pause");return 0;}/*功能:折半查找。参数:pST -- 线性表指针key -- 查找关键字返回值:如果查找成功返回关键字在表中的位置如果查找失败返回 0*/int BinarySearch(SeqTable* pST, KeyType key){int low = 1;int high = pST->length;int mid;while (low < high){mid = (low + high) / 2;if (pST->elem[mid].key == key){return mid;break;}else if (pST->elem[mid].key>key){high = mid - 1;}else{low = mid + 1;}}}/*功能:初始化线性表。参数:pST -- 线性表指针*/// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12int InitArray[] = { 2, 4, 11, 18, 25, 32, 39, 46, 53, 60, 67, 74 };// 顺序必须为从小到大void InitSeqTable(SeqTable* pST){int i;pST->length = sizeof(InitArray) / sizeof(InitArray[0]);pST->elem = (ElemType*)malloc((pST->length + 1) * sizeof(ElemType));// 因为单元 0 留空,所以长度必须加 1for (i = 1; i <= pST->length; i++)pST->elem[i].key = InitArray[i - 1];}/*功能:销毁线性表。参数:pST -- 线性表指针*/void DeleteSeqTable(SeqTable* pST){free(pST->elem);pST->elem = NULL;pST->length = 0;}
博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html