10.1几种基本排序算法的实现_第1页
10.1几种基本排序算法的实现_第2页
10.1几种基本排序算法的实现_第3页
10.1几种基本排序算法的实现_第4页
10.1几种基本排序算法的实现_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数 据 结 构 实 验 报 告实验题目:几种基本排序算法的实现姓名: 张耀班级: 计嵌151学号: 1513052017一、 实验目的实现直接插入排序,冒泡排序,简单选择排序,快速排序,希尔排序,堆排序等6种常用内部排序算法,比较各算法的比较次数和移动次数。二、 数据结构设计(1) 设计待排序记录的存储结构。(2) 设计待排序数据的存储结构。(3) 输入:待排序数据的数据个数和数据可由键盘输入,也可由程序生成伪随机数,以菜单方式选择上述排序方法中的一个,并指明输出第几趟排序的结果。(4)输出:各趟排序结果或指定趟的排序结果,以及对应的关键字比较次数和移动次数。三、 算法设计与N-S图算法设计:编写一个主函数main(),在主函数中设计一个简单的菜单,分别调用6种内部排序算法。为了对各种排序算法的性能进行比较,算法中的主要工作是在已知算法的适当位置插入对关键字的比较次数和移动次数的计数操作。为此,可设立一个实现排序算法中的关键字比较的函数;设立一个实现排序算法中的关键字移动的函数;设立一个实现排序算法中的关键字交换的函数,从而解决比较次数和移动次数的统计问题。数据的输入也可以通过菜单选择输入方式:键盘输入或由伪随机数程序生成数据,以便随时更换排序数据,并按照不同要求对排序数据进行排序,输出排序的结果以及对应的关键字比较次数和移动次数。对于测试数据,算法中可以考虑几组数据的典型性,如正序,逆序和不同程度等,以取得直观的感受,从而对不同算法进行比较。四、 程序清单#includeusing namespace std;void showMenu()cout * 菜单 * endl;cout 1.直接插入排序 endl;cout 2.冒泡排序 endl;cout 3.简单选择排序 endl;cout 4.快速排序 endl;cout 5.希尔排序 endl;cout 6.堆排序 endl;cout 7.退出程序 endl;struct SqListint * key;int length;void CreateSqList(SqList &sl)/type为intint n;cout 建立顺序表 endl 请输入顺序表的长度 n;sl.length = n;sl.key = new intsl.length + 1;cout 请输入数据: endl;for (int i = 1; i sl.keyi;void Copy(SqList &L1,SqList &L2)L2.length = L1.length;L2.key = new intL1.length + 1;for (int i = 1; i =L1.length; i+)L2.keyi = L1.keyi;void OutPut(SqList &L)for (int j = 1; j = L.length; +j)cout L.keyj t;cout endl;void InsertSort(SqList & L)/对顺序表L作直接插入排序int k = 0;int compare_Time, move_Time;compare_Time = move_Time = 0;for (int i = 2; i = L.length; i+)if (L.keyi = L.keyi - 1)/需将L.keyi插入有序子表L.key0 = L.keyi;/复制为哨兵L.keyi = L.keyi - 1;int j;for (j = i - 2; L.key0 = L.keyj; -j)compare_Time+;L.keyj + 1 = L.keyj;/记录后移move_Time+;L.keyj + 1 = L.key0;/插入到正确位置k+;cout 第 k 趟排序结果:; OutPut(L);compare_Time+;cout 比较次数为: compare_Time endl; cout 移动次数为: move_Time endl;void BubbleSort(SqList & L)int k = 0;int compare_Time, move_Time;compare_Time = move_Time = 0;for (int i = 1; iL.length; i+)/用i控制比较趟数共n-1趟int t;for (int j = 1; j L.keyj + 1)t = L.keyj;L.keyj = L.keyj + 1;L.keyj + 1 = t;move_Time+;k+;cout 第 k 趟排序结果:; OutPut(L);cout 比较次数为: compare_Time endl;cout 移动次数为: move_Time endl;int SelectMinKey(SqList& L, int n, int &compare_Time)int min = n;int minkey;/最小值minkey = L.keyn;for (int i = n + 1; i = L.length; i+)if (L.keyiminkey)minkey = L.keyi;min = i;compare_Time+;return min;void SelectSort(SqList & L)/对顺序表L作简单选择排序int j;int t;int k = 0;int move_Time = 0, compare_Time = 0;for (int i = 1; i = L.length; i+)j = SelectMinKey(L, i, compare_Time);/在L.keyi-L.keyL.length中选择最小的记录并将其地址赋给jif (i != j)/交换记录t = L.keyi;L.keyi = L.keyj;L.keyj = t;move_Time+;compare_Time+;k+;cout 第 k 趟排序结果:; OutPut(L);cout 比较次数为: compare_Time endl;cout 移动次数为: move_Time endl;int Partition(SqList& L, int low, int high,int &compare_Time,int &move_Time)/交换顺序表L中子表keylow-keyhigh中的记录,枢轴记录到位,并返回其所在位置,/此时在它之前(后)的记录均不大(小)于它int pivotkey;L.key0 = L.keylow;/用子表的第一个记录作枢轴记录pivotkey = L.keylow;/关键字while (lowhigh)/从表的两端交替向中间扫描compare_Time+;while (low= pivotkey) -high;L.keylow = L.keyhigh;move_Time+;/将比枢轴小的记录移至低端while (lowhigh&L.keylow = pivotkey) +low;L.keyhigh = L.keylow;/将比枢轴大的记录移至高端move_Time+;L.keylow = L.key0;/枢轴记录到位return low;/返回枢轴位置void QSort(SqList& L, int low, int high,int &k,int &compare_Time,int &move_Time)int mid;/接收枢轴位置if (lowhigh)mid = Partition(L, low, high,compare_Time,move_Time);k+;cout 第 k 趟排序结果:; OutPut(L);QSort(L, low, mid - 1,k,compare_Time,move_Time);/对低子表进行排序QSort(L, mid + 1, high, k, compare_Time, move_Time);/对高子表进行排序void QuitSort(SqList & L)/对顺序表进行快速排序int k = 0;int compare_Time = 0, move_Time = 0;QSort(L, 1, L.length,k,compare_Time,move_Time);cout 比较次数为: compare_Time endl;cout 移动次数为: move_Time endl;void ShellInsert(SqList &L, int dk, int &compare_Time, int &move_Time)/对顺序表进行一趟希尔插入排序for (int i = dk + 1; i = L.length; i+)if (L.keyi 0 & L.key0 = L.keyj; j -= dk)compare_Time+;L.keyj + dk = L.keyj;move_Time+;L.keyj + dk = L.key0;void ShellSort(SqList &L, int dlta, int t)int compare_Time = 0, move_Time = 0;/按增量序列dl0-dlt-1对顺序表L作哈希排序for (int k = 0; k t; k+)ShellInsert(L, dltak, compare_Time, move_Time);cout 第 k+1 趟排序结果:; OutPut(L);cout 比较次数为: compare_Time endl;cout 移动次数为: move_Time endl;void HeapAdjust(SqList& L, int s, int m, int &compare_Time, int &move_Time)/对顺序表做查找,从值最大的孩子结点向下筛选,找到最大值int rc = L.keys;for (int j = 2 * s; j = m; j *= 2)if (jm&L.keyj L.keyj) break;/如果rc最大则推出while循环L.keys = L.keyj;/最大值赋值s = j;/交换位置move_Time+;L.keys = rc;void HeapSort(SqList & L)/对顺序表L进行堆排序int value,i;int k = 0;int compare_Time = 0, move_Time = 0;for (i = L.length / 2; i0; i-)/把L.key1.L.length调整为大顶堆HeapAdjust(L, i, L.length, compare_Time, move_Time);for (i = L.length; i1; -i)value = L.key1;L.key1 = L.keyi;L.keyi = value;HeapAdjust(L, 1, i - 1, compare_Time, move_Time);/将L.key1.i-1重新调整为大顶堆k+;cout 第 k 趟排序结果:; OutPut(L);cout 比较次数为: compare_Time endl;cout 移动次数为: move_Time endl;int main()int choice;SqList sq,sp;CreateSqList(sq);Copy(sq, sp);showMenu();cout choice;while (choice != 0)switch (choice)case 1:InsertSort(sq); cout 最终结果:;OutPut(sq); break;case 2:BubbleSort(sq); cout 最终结果:;OutPut(sq); break;case 3:SelectSort(sq); cout 最终结果:;OutPut(sq); break;case 4:QuitSort(sq); cout 最终结果:;OutPut(sq); break;case 5:int *p, n;cout 请输入增量个数: n;p = new intn;cout 请输入各个增量的值: endl;for (int i = 0; i pi;ShellSort(sq, p, n); cout 最终结果:;OutPut(sq); break;case 6:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论