排序问题实验报告
数据结构实验报告八-快速排序

实验8 快速排序1.需求分析(1)输入的形式和输入值的范围:第一行是一个整数n,代表任务的件数。
接下来一行,有n个正整数,代表每件任务所用的时间。
中间用空格或者回车隔开。
不对非法输入做处理,及假设用户输入都是合法的。
(2)输出的形式:输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。
按此顺序进行,则使得所有任务等待时间最小。
(3)程序所能达到的功能:在操作系统中,当有n 件任务同时来临时,每件任务需要用时ni,输出所有任务等待的时间和最小的任务处理顺序。
(4)测试数据:输入请输入任务个数:9请输入任务用时:5 3 4 2 6 1 5 7 3输出任务执行的顺序:1 2 3 3 4 5 5 6 72.概要设计(1)抽象数据类型的定义:为实现上述程序的功能,应以整数存储用户的第一个输入。
并将随后输入的一组数据储存在整数数组中。
(2)算法的基本思想:如果将任务按完成时间从小到大排序,则在完成前一项任务时后面任务等待的时间总和最小,即得到最小的任务处理顺序。
采取对输入的任务时间进行快速排序的方法可以在相对较小的时间复杂度下得到从小到大的顺序序列。
3.详细设计(1)实现概要设计中定义的所有数据类型:第一次输入的正整数要求大于零,为了能够存储,采用int型定义变量。
接下来输入的一组整数,数据范围大于零,为了排序需要,采用线性结构存储,即int类型的数组。
(2)实现程序的具体步骤:一.程序主要采取快速排序的方法处理无序数列:1.在序列中根据随机数确定轴值,根据轴值将序列划分为比轴值小和比轴值大的两个子序列。
2.对每个子序列采取从左右两边向中间搜索的方式,不断将值与轴值比较,如果左边的值大于轴值而右边的小于轴值则将二者交换,直到左右交叉。
3.分别对处理完毕的两个子序列递归地采取1,2步的操作,直到子序列中只有一个元素。
二.程序各模块的伪代码:1、主函数int main(){int n;cout<<"请输入任务个数:";cin>>n;int a[n];cout<<"请输入任务用时:";for(int i=0;i<n;i++) cin>>a[i];qsort(a,0,n-1); //调用“快排函数”cout<<"任务执行的顺序:";for(int i=0;i<n;i++) cout<<a[i]<<" "; //输出排序结果}2、快速排序算法:void qsort(int a[],int i,int j){if(j<=i)return; //只有一个元素int pivotindex=findpivot(a,i,j); //调用“轴值寻找函数”确定轴值swap(a,pivotindex,j); //调用“交换函数”将轴值置末int k=partition(a,i-1,j,a[j]); //调用“分割函数”根据轴值分割序列swap(a,k,j);qsort(a,i,k-1); //递归调用,实现子序列的调序qsort(a,k+1,j);}3、轴值寻找算法://为了保证轴值的“随机性”,采用时间初始化种子。
利用指针排序实验报告(3篇)

第1篇一、实验目的1. 理解指针在排序算法中的应用。
2. 掌握几种常见的排序算法(如冒泡排序、选择排序、插入排序等)的指针实现方式。
3. 比较不同排序算法的效率,分析其优缺点。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容本次实验主要实现了以下排序算法:1. 冒泡排序2. 选择排序3. 插入排序以下是对每种排序算法的具体实现和性能分析。
1. 冒泡排序(1)算法原理冒泡排序是一种简单的排序算法。
它重复地遍历待排序的序列,比较每对相邻的元素,如果它们的顺序错误就把它们交换过来。
遍历序列的工作是重复地进行,直到没有再需要交换的元素为止。
(2)指针实现```cppvoid bubbleSort(int arr, int len) {for (int i = 0; i < len - 1; i++) {for (int j = 0; j < len - 1 - i; j++) {if ((arr + j) > (arr + j + 1)) {int temp = (arr + j);(arr + j) = (arr + j + 1);(arr + j + 1) = temp;}}}}```(3)性能分析冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。
当待排序序列基本有序时,冒泡排序的性能较好。
2. 选择排序(1)算法原理选择排序是一种简单直观的排序算法。
它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
(2)指针实现```cppvoid selectionSort(int arr, int len) {for (int i = 0; i < len - 1; i++) {int minIndex = i;for (int j = i + 1; j < len; j++) {if ((arr + j) < (arr + minIndex)) {minIndex = j;}}int temp = (arr + i);(arr + i) = (arr + minIndex);(arr + minIndex) = temp;}}```(3)性能分析选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。
排序比较的实验报告

一、实验目的1. 了解常见的排序算法及其基本原理。
2. 比较不同排序算法的时间复杂度和空间复杂度。
3. 分析不同排序算法在实际应用中的适用场景。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 数据集:随机生成的10000个整数三、实验内容本次实验主要比较以下排序算法:1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 快速排序(Quick Sort)5. 归并排序(Merge Sort)四、实验步骤1. 定义排序算法函数。
2. 生成随机整数数据集。
3. 对每个排序算法进行多次测试,记录其时间消耗。
4. 比较不同排序算法的时间复杂度和空间复杂度。
5. 分析不同排序算法在实际应用中的适用场景。
五、实验结果与分析1. 冒泡排序空间复杂度:O(1)冒泡排序是一种简单的排序算法,其基本思想是通过两两比较相邻元素的大小,将较大的元素交换到后面,直到排序完成。
实验结果显示,冒泡排序的时间消耗较高,不适合处理大数据集。
2. 选择排序时间复杂度:O(n^2)空间复杂度:O(1)选择排序的基本思想是每次从待排序的序列中找到最小(或最大)元素,将其放到序列的起始位置,然后继续对剩余未排序的序列进行同样的操作。
实验结果显示,选择排序的时间消耗与冒泡排序相近,同样不适合处理大数据集。
3. 插入排序时间复杂度:O(n^2)空间复杂度:O(1)插入排序的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。
实验结果显示,插入排序的时间消耗与冒泡排序和选择排序相近,同样不适合处理大数据集。
4. 快速排序时间复杂度:O(nlogn)空间复杂度:O(logn)快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,再分别对这两部分记录继续进行排序,以达到整个序列有序。
排序检验实验报告

一、实验目的1. 理解排序检验的基本原理和方法。
2. 掌握排序检验的应用场景。
3. 通过实际操作,验证排序检验的有效性。
二、实验原理排序检验(Rank Test)是一种非参数检验方法,用于检验两个独立样本是否来自同一总体。
其基本思想是将样本数据从小到大排序,计算两个样本的秩和,然后根据秩和比较两个样本是否具有显著差异。
三、实验材料1. 计算机2. 数据处理软件(如SPSS、R等)3. 实验数据四、实验步骤1. 收集实验数据,确保两组数据相互独立。
2. 对两组数据进行排序,得到各自的秩。
3. 计算两组数据的秩和。
4. 根据秩和计算检验统计量。
5. 根据检验统计量查表得到临界值。
6. 判断两组数据是否来自同一总体。
五、实验结果与分析1. 数据描述本实验选取了两组独立样本,分别为样本A和样本B。
样本A包含10个数据,样本B包含10个数据。
两组数据如下:样本A:3, 5, 7, 8, 9, 10, 12, 13, 14, 15样本B:1, 4, 6, 7, 8, 9, 10, 11, 12, 132. 排序及秩计算将两组数据从小到大排序,得到各自的秩:样本A:1, 2, 3, 4, 5, 6, 7, 8, 9, 10样本B:1, 2, 3, 4, 5, 6, 7, 8, 9, 103. 秩和计算计算两组数据的秩和:样本A秩和:1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55样本B秩和:1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 554. 检验统计量及临界值计算检验统计量:T = |秩和A - 秩和B| / √[nA nB (nA + nB + 1) / 12]T = |55 - 55| / √[10 10 (10 + 10 + 1) / 12]T = 0查表得到临界值,以α = 0.05为例,查表得到临界值为1.98。
5. 判断结果由于计算得到的检验统计量T = 0小于临界值1.98,因此无法拒绝原假设,即两组数据来自同一总体。
数据结构实验报告-排序

数据结构实验报告-排序一、实验目的本实验旨在探究不同的排序算法在处理大数据量时的效率和性能表现,并对比它们的优缺点。
二、实验内容本次实验共选择了三种常见的排序算法:冒泡排序、快速排序和归并排序。
三个算法将在同一组随机生成的数据集上进行排序,并记录其性能指标,包括排序时间和所占用的内存空间。
三、实验步骤1. 数据的生成在实验开始前,首先生成一组随机数据作为排序的输入。
定义一个具有大数据量的数组,并随机生成一组在指定范围内的整数,用于后续排序算法的比较。
2. 冒泡排序冒泡排序是一种简单直观的排序算法。
其基本思想是从待排序的数据序列中逐个比较相邻元素的大小,并依次交换,从而将最大(或最小)的元素冒泡到序列的末尾。
重复该过程直到所有数据排序完成。
3. 快速排序快速排序是一种分治策略的排序算法,效率较高。
它将待排序的序列划分成两个子序列,其中一个子序列的所有元素都小于等于另一个子序列的所有元素。
然后对两个子序列分别递归地进行快速排序。
4. 归并排序归并排序是一种稳定的排序算法,使用分治策略将序列拆分成较小的子序列,然后递归地对子序列进行排序,最后再将子序列合并成有序的输出序列。
归并排序相对于其他算法的优势在于其稳定性和对大数据量的高效处理。
四、实验结果经过多次实验,我们得到了以下结果:1. 冒泡排序在数据量较小时,冒泡排序表现良好,但随着数据规模的增大,其性能明显下降。
排序时间随数据量的增长呈平方级别增加。
2. 快速排序相比冒泡排序,快速排序在大数据量下的表现更佳。
它的排序时间线性增长,且具有较低的内存占用。
3. 归并排序归并排序在各种数据规模下都有较好的表现。
它的排序时间与数据量呈对数级别增长,且对内存的使用相对较高。
五、实验分析根据实验结果,我们可以得出以下结论:1. 冒泡排序适用于数据较小的排序任务,但面对大数据量时表现较差,不推荐用于处理大规模数据。
2. 快速排序是一种高效的排序算法,适用于各种数据规模。
实验报告_冒泡排序法(3篇)

第1篇一、实验目的1. 理解冒泡排序算法的基本原理和操作步骤。
2. 掌握冒泡排序算法的实现方法。
3. 分析冒泡排序算法的时间复杂度和空间复杂度。
4. 通过实验验证冒泡排序算法的效率。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验原理冒泡排序是一种简单的排序算法,其基本思想是通过多次比较和交换相邻元素,将待排序的序列变为有序序列。
冒泡排序算法的基本步骤如下:1. 从第一个元素开始,相邻的两个元素进行比较,如果它们的顺序错误(即第一个元素大于第二个元素),则交换它们的位置。
2. 重复步骤1,对相邻的元素进行比较和交换,直到整个序列的最后一个元素。
3. 第一轮排序完成后,最大的元素被放置在序列的最后一个位置。
4. 从第一个元素开始,对剩余的元素重复步骤1和步骤2,直到序列的倒数第二个元素。
5. 重复步骤3和步骤4,直到整个序列有序。
四、实验步骤1. 编写冒泡排序算法的C++代码,实现上述算法步骤。
2. 在主函数中创建一个待排序的数组。
3. 调用冒泡排序函数对数组进行排序。
4. 输出排序前后的数组,验证排序结果。
五、实验代码```cppinclude <iostream>using namespace std;// 冒泡排序函数void bubbleSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) {// 交换相邻元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}// 打印数组函数void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;}int main() {// 创建待排序的数组int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr) / sizeof(arr[0]);// 打印排序前的数组cout << "排序前的数组:\n";printArray(arr, n);// 调用冒泡排序函数bubbleSort(arr, n);// 打印排序后的数组cout << "排序后的数组:\n";printArray(arr, n);return 0;}```六、实验结果与分析1. 运行实验程序,输出排序前后的数组,验证排序结果是否正确。
排序的实验报告

排序的实验报告排序的实验报告引言:排序是计算机科学中非常重要的一个概念,它涉及到对一组数据按照一定规则进行重新排列的操作。
在计算机算法中,排序算法的效率直接影响到程序的运行速度和资源利用率。
为了深入了解各种排序算法的原理和性能,我们进行了一系列的排序实验。
实验一:冒泡排序冒泡排序是最简单的排序算法之一。
它的原理是通过相邻元素的比较和交换来实现排序。
我们编写了一个冒泡排序的算法,并使用Python语言进行实现。
实验中,我们分别对10、100、1000个随机生成的整数进行排序,并记录了排序所需的时间。
实验结果显示,随着数据规模的增加,冒泡排序的时间复杂度呈现出明显的增长趋势。
当数据规模为10时,排序所需的时间约为0.001秒;而当数据规模增加到1000时,排序所需的时间则增加到了1.5秒左右。
这说明冒泡排序的效率较低,对大规模数据的排序并不适用。
实验二:快速排序快速排序是一种常用的排序算法,它的核心思想是通过分治的策略将数据分成较小的子集,然后递归地对子集进行排序。
我们同样使用Python语言实现了快速排序算法,并对相同规模的数据进行了排序实验。
实验结果显示,快速排序的时间复杂度相对较低。
当数据规模为10时,排序所需的时间约为0.0005秒;而当数据规模增加到1000时,排序所需的时间仅为0.02秒左右。
这说明快速排序适用于大规模数据的排序,其效率较高。
实验三:归并排序归并排序是一种稳定的排序算法,它的原理是将待排序的数据分成若干个子序列,然后将子序列两两合并,直到最终得到有序的结果。
我们同样使用Python 语言实现了归并排序算法,并进行了相同规模数据的排序实验。
实验结果显示,归并排序的时间复杂度相对较低。
当数据规模为10时,排序所需的时间约为0.0008秒;而当数据规模增加到1000时,排序所需的时间仅为0.03秒左右。
这说明归并排序同样适用于大规模数据的排序,其效率较高。
讨论与结论:通过以上实验,我们可以得出以下结论:1. 冒泡排序虽然简单易懂,但对于大规模数据的排序效率较低,不适用于实际应用。
常见算法设计实验报告(3篇)

第1篇一、实验目的通过本次实验,掌握常见算法的设计原理、实现方法以及性能分析。
通过实际编程,加深对算法的理解,提高编程能力,并学会运用算法解决实际问题。
二、实验内容本次实验选择了以下常见算法进行设计和实现:1. 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序。
2. 查找算法:顺序查找、二分查找。
3. 图算法:深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim算法、Kruskal算法)。
4. 动态规划算法:0-1背包问题。
三、实验原理1. 排序算法:排序算法的主要目的是将一组数据按照一定的顺序排列。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。
2. 查找算法:查找算法用于在数据集中查找特定的元素。
常见的查找算法包括顺序查找和二分查找。
3. 图算法:图算法用于处理图结构的数据。
常见的图算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim算法、Kruskal算法)等。
4. 动态规划算法:动态规划算法是一种将复杂问题分解为子问题,通过求解子问题来求解原问题的算法。
常见的动态规划算法包括0-1背包问题。
四、实验过程1. 排序算法(1)冒泡排序:通过比较相邻元素,如果顺序错误则交换,重复此过程,直到没有需要交换的元素。
(2)选择排序:每次从剩余元素中选取最小(或最大)的元素,放到已排序序列的末尾。
(3)插入排序:将未排序的数据插入到已排序序列中适当的位置。
(4)快速排序:选择一个枢纽元素,将序列分为两部分,使左侧不大于枢纽,右侧不小于枢纽,然后递归地对两部分进行快速排序。
(5)归并排序:将序列分为两半,分别对两半进行归并排序,然后将排序好的两半合并。
(6)堆排序:将序列构建成最大堆,然后重复取出堆顶元素,并调整剩余元素,使剩余元素仍满足最大堆的性质。
2. 查找算法(1)顺序查找:从序列的第一个元素开始,依次比较,直到找到目标元素或遍历完整个序列。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010级数据结构实验报告实验名称:排序姓名:袁彬班级: 2009211120班内序号: 09学号: 09210552日期: 2010 年12 月19 日1.实验要求试验目的:通过选择试验内容中的两个题目之一,学习、实现、对比各种排序的算法,掌握各种排序算法的优缺点,以及各种算法使用的情况。
试验内容:题目一:使用简单数组实现下面各种排序算法,并进行比较。
排序算法如下:①插入排序;②希尔排序③冒泡排序;④快速排序;⑤简单选择排序;⑥堆排序⑦归并排序⑧基数排序⑨其他。
具体要求如下:①测试数据分为三类:正序,逆序,随机数据。
②对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换记为三次移动)。
③对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙。
④对②和③的结果进行分析,验证上述各种算法的时间复杂度。
⑤编写main()函数测试各种排序算法的正确性。
题目二:使用链表实现下面各种排序算法,并进行比较。
排序算法如下:①插入排序;②冒泡排序;③快速排序;④简单选择排序;⑤其他。
具体要求如下:①测试数据分为三类:正序,逆序,随机数据。
②对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换记为三次移动)。
③对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙(选作)④对②和③的结果进行分析,验证上述各种算法的时间复杂度。
⑤编写main()函数测试各种排序算法的正确性。
2. 程序分析2.1 存储结构程序中每一个算法均是用一个类来表示的,类中有自己的构造函数、排序函数。
程序的储存结构采用数组。
数组的第一个位置不存储数据。
数据从第二个位置开始。
数组中的相对位置为数组的下标。
2.2 关键算法分析㈠、关键算法:1、插入排序函数:Insert s ort(int n)①、从2开始做循环,依次和前面的数进行比较:for(int i=2;i<=n;i++)②、如果后面的比前面的小,则进行前移:if(number[i]<number[i-1])③、设置哨兵:number[0]=number[i];④、如果后面的比前面的小,前面的进行后移:for(j=i-1;number[0]<number[j];j--)⑤、前面的进行后移:number[j+1]=number[j];⑥、将比较的数据放置到正确位置:number[j+1]=number[0];2、希尔排序函数:Shell i nsert(int n)①、以长度的一半为间隔进行循环:for(int d=n/2;d>=1;d=d/2)②、在自己的间隔中进行简单插入排序,进行循环:for(int i=d+1;i<=n;i++)③、如果后面的数据比前面的小,进行前移:if(number[i]<number[i-d])④、设置哨兵:number[0]=number[i];⑤、在自己的间隔中进行简单插入排序:for(j=i-d;number[0]<number[j]&&j>0;j=j-d)⑥、大的数据后移:number[j+d]=number[j];⑦、哨兵归位:number[j+d]=number[0];3、冒泡排序函数:Bubble s ort(int n)①、设置有序无序的边界点:int pos=n;②、当边界点不为空进行循环:while(pos!=0)③、边界点传递给bound:int bound=pos;④、从开始到边界点进行循环:for(int i=1;i<bound;i++)⑤、如果前面的数据比后面的大,进行交换:if(number[i]>number[i+1])⑥、交换:number[0]=number[i];number[i]=number[i+1];number[i+1]=number[0];⑦、从小设置边界点:pos=i;4、一趟快速排序函数:partion(int first,int end)①、传递设置整个数据的起点和终点:int i=first;int j=end;②、设置中轴:number[0]=number[i];③、当end大于first进行循环:while(i<j)④、当后面的数据大于中轴,后面的游标前移:while((i<j)&&(number[j]>=number[0])) j--;⑤、中轴和比它大的数据进行交换:number[i]=number[j];⑥、当前面的数据小于中轴,前面的游标后移:while((i<j)&&(number[i]<=number[0]))i++;⑦、中轴和比它小的数据进行交换:number[j]=number[i];⑧、将中轴进行归位:number[i]=number[0];5、递归快速排序函数:Qsort(int i,int j)①、如果数组不为空,进行排序:if(i<j)②、一趟冒泡排序:int pivotloc=partion(i,j);③、递归将左右半面进行排序:Qsort(i,pivotloc-1);Qsort(pivotloc+1,j);6、简单选择排序函数:Select s ort(int n)①、从数组开始到结尾进行遍历:for(int i=1;i<n;i++)②、设置最小数据标记:int index=i;③、在无序区进行循环:for(int j=i+1;j<=n;j++)④、当出现比标记还小的数据,就进行交换:if(number[j]<number[index])index=j;⑤、如果最小的不是末尾的数,就进行交换:if(index!=i)⑥、进行交换:number[0]=number[i];number[i]=number[index];number[index]=number[0];7、一趟堆排序函数:sift(int k,int m)①、设置根节点和孩子的位置:int i=k,j=2*k;②、从左右孩子中选择出最小的孩子:if(j<m&&number[j]>number[j+1])j++;③、判断根节点是不是最小的,不是就进行交换:if(number[i]<number[j])break;④、进行交换:number[0]=number[i];number[i]=number[j];number[j]=number[0];⑤、将根节点和孩子位置后移,继续排序:i=j;j=2*i;8、递归堆排序函数:Heap s ort(int n)①、从最大非叶子节点,进行一趟堆排序:for(i=n/2;i>=1;i--)②、进行数组长度值的循环:for(i=1;i<n;i++)③、将根节点和尾节点进行交换:number[0]=number[1];number[1]=number[n-i+1];number[n-i+1]=number[0];④、在进行一趟堆排序:sift(1,n-i);9、一趟归并排序函数:Merge(int *r, int *r1, int s, int m, int t)①、传递设置两个数组的起点和终点:int i=s;int j=m+1;int k=s;②、当任意一个数组没有达到终点时,进行循环:while(i<=m&&j<=t)③、进行循环,将较小的值传给r1数组:if(r[i]<r[j])④、将较小的值传给r1数组:r1[k++]=r[i++];else r1[k++]=r[j++];⑤、当一个数字已经比较完,做循环将其续借到r1数组中:if(i<=m)while(i<=m)r1[k++]=r[i++];⑤、当另一个数字已经比较完,做循环将其续借到r1数组中:if(j<=t)while(j<=t)r1[k++]=r[j++];10、递归归并排序函数:MergeSort(int *r, int *r1, int s, int t)①、创建新数字指针存储排序序列:int *r2=new int[t];②、当序列中只有一个数据时,令其相等:if(s==t)r1[s]=r[s];③、否则,进行递归:else④、将原数组折半:int m=(s+t)/2;⑤、将前半数组进行递归调用:MergeSort(r,r2,s,m);⑥、将后半数组进行递归调用:MergeSort(r,r2,m+1,t);⑦、将数组进行递归调用:Merge(r2,r1,s,m,t);㈡、关键算法的时间、空间复杂度①、直接插入排序函数:时间复杂度O(n2)②、希尔排序函数:时间复杂度O(n㏒2 n)③、起泡排序:时间复杂度O(n2)④、快速排序:时间复杂度O(n㏒2 n)⑤、简单选择排序:时间复杂度O(n2)⑥、堆排序:时间复杂度O(n㏒2 n)⑦、归并排序:时间复杂度O(n㏒2 n)3. 程序运行结果测试主函数流程:程序流程图如下:4. 总结(1)、出现的问题及调试的方法这次试验总的来说是比较简单的,因为这七种排序算法的代码书上都有,在理解的基础上参考书上的代码输入基本上不会有太大的问题,但问题还是有的。
例如:一组待排序的整数存在一个数组中,当采用一种排序算法对这个数组进行排序后,数组就被修改了,变为有序的序列,这是一个问题,于是我动态申请了七个数组,每次排序对不同的数组进行,这个问题就解决了(2)、心得体会这次试验是我对排序运算有了深刻的理解,对我们课堂上的知识进行回顾。
在程序编译和链接时还报了一些错,最后我对排序运算有了深刻的理解,对我们课堂上的知识进行回顾。
在程序编译和链接时还报了一些错,最后通过一步一步的测试,也很快解决了问题。
通过这次程序我感觉我对C++调试有个很深的理解,对程序的调试有了很多心得,也对我的程序调试和编写有了进一步的提高。
同时对C++编程进一步熟悉,同时对数据结构有了一个整体的认识,对各种排序中函数成员实现的原理、代码进一步了解。
同时对各种排序的优缺点有了进一步的认识和了解。
在这个程序中,我觉得下一步程序可以进一步对时间复杂度进行优化,通过将程序的冗长的代码删除,优化算法等,让程序得到结果所需要的时间更短、更快,删除一些代码,让程序的空间复杂度和时间复杂度都减小。
(3)、下一步的改进程序中代码有一部分不是太简洁,例如七个数组、统计比较了移动次数这些代码显得比较乱。