算法排序问题实验报告
算法实验报告

算法实验报告算法实验报告引言:算法是计算机科学的核心内容之一,它是解决问题的方法和步骤的描述。
算法的设计和分析是计算机科学与工程中的重要研究方向之一。
本实验旨在通过对算法的实际应用和实验验证,深入理解算法的性能和效果。
实验一:排序算法的比较在本实验中,我们将比较三种常见的排序算法:冒泡排序、插入排序和快速排序。
我们将通过对不同规模的随机数组进行排序,并记录每种算法所需的时间和比较次数,以评估它们的性能。
实验结果显示,快速排序是最快的排序算法,其时间复杂度为O(nlogn),比较次数也相对较少。
插入排序的时间复杂度为O(n^2),比较次数较多,但对于小规模的数组排序效果较好。
而冒泡排序的时间复杂度也为O(n^2),但比较次数更多,效率相对较低。
实验二:图的最短路径算法在图的最短路径问题中,我们将比较Dijkstra算法和Floyd-Warshall算法的效率和准确性。
我们将使用一个带权有向图,并计算从一个顶点到其他所有顶点的最短路径。
实验结果表明,Dijkstra算法适用于单源最短路径问题,其时间复杂度为O(V^2),其中V为顶点数。
而Floyd-Warshall算法适用于多源最短路径问题,其时间复杂度为O(V^3)。
两种算法在准确性上没有明显差异,但在处理大规模图时,Floyd-Warshall算法的效率较低。
实验三:动态规划算法动态规划是一种通过将问题分解成子问题并记录子问题的解来解决复杂问题的方法。
在本实验中,我们将比较两种动态规划算法:0-1背包问题和最长公共子序列问题。
实验结果显示,0-1背包问题的动态规划算法可以有效地找到最优解,其时间复杂度为O(nW),其中n为物品个数,W为背包容量。
最长公共子序列问题的动态规划算法可以找到两个序列的最长公共子序列,其时间复杂度为O(mn),其中m和n分别为两个序列的长度。
结论:通过本次实验,我们对不同算法的性能和效果有了更深入的了解。
排序算法中,快速排序是最快且效率最高的;在图的最短路径问题中,Dijkstra算法和Floyd-Warshall算法分别适用于不同的场景;动态规划算法可以解决复杂的问题,并找到最优解。
排序实验报告_排序综合实验报告材料

班级
2*10^7
10 电信 1 班
10^8
操作系统
10^5
Microsoft Windows 7 旗舰版 (64 位/Service Pck 1)
正序
xxxxxxxxxxxxx
逆序
编译软件
直接插入
Visul C++ 6.0
(带监视哨〕
emil
C
609803959.
24.874
10^4
100.158
2*10^4
中选出键值最小的记录,与无序区第一个记录 R 交换;新的无序区为 R 到
各种排序试验结果:
R[n],从中再选出键值最小的记录,与无序区第一个记录 R 交换;类似, CPU
第 i 趟排序时 R 到 R[i-1]是有序区,无序区为 R[i]到 R[n],从中选出键
(英特尔)Intel(R) Core(TM) i5 CPU M 480 2.67GHz
〔1〕二路并归排序:开始时,将排序表 R 到 R[n]看成 n 个长度为 1
录,顺序放在已排好序的子序列的后面〔或最前〕,直到全部记录排序完 的有序子表,把这些子表两两并归,便得到 n/2 个有序的子表〔当 n 为奇
毕。
数时,并归后仍是有一个长度为 1 的子表〕;然后,再把这 n/2 个有序的
〔1〕直接选择排序:首先,全部记录组成初始无序区 R 到 R[n],从 子表两两并归,如此反复,直到最终得到一个程度为 n 的有序表为止。
指导老师: 胡圣荣
序与排序要求相反时就交换两者的位置,直到没有反序的记录为止。
日期: 20XX.12.15~20XX.1.5
〔1〕冒泡排序:设想排序表 R 到 R[n]垂直放置,将每个记录 R[i]看
算法课设实验报告(3篇)

第1篇一、实验背景与目的随着计算机技术的飞速发展,算法在计算机科学中扮演着至关重要的角色。
为了加深对算法设计与分析的理解,提高实际应用能力,本实验课程设计旨在通过实际操作,让学生掌握算法设计与分析的基本方法,学会运用所学知识解决实际问题。
二、实验内容与步骤本次实验共分为三个部分,分别为排序算法、贪心算法和动态规划算法的设计与实现。
1. 排序算法(1)实验目的:熟悉常见的排序算法,理解其原理,比较其优缺点,并实现至少三种排序算法。
(2)实验内容:- 实现冒泡排序、快速排序和归并排序三种算法。
- 对每种算法进行时间复杂度和空间复杂度的分析。
- 编写测试程序,对算法进行性能测试,比较不同算法的优劣。
(3)实验步骤:- 分析冒泡排序、快速排序和归并排序的原理。
- 编写三种排序算法的代码。
- 分析代码的时间复杂度和空间复杂度。
- 编写测试程序,生成随机测试数据,测试三种算法的性能。
- 比较三种算法的运行时间和内存占用。
2. 贪心算法(1)实验目的:理解贪心算法的基本思想,掌握贪心算法的解题步骤,并实现一个贪心算法问题。
(2)实验内容:- 实现一个贪心算法问题,如活动选择问题。
- 分析贪心算法的正确性,并证明其最优性。
(3)实验步骤:- 分析活动选择问题的贪心策略。
- 编写贪心算法的代码。
- 分析贪心算法的正确性,并证明其最优性。
- 编写测试程序,验证贪心算法的正确性。
3. 动态规划算法(1)实验目的:理解动态规划算法的基本思想,掌握动态规划算法的解题步骤,并实现一个动态规划算法问题。
(2)实验内容:- 实现一个动态规划算法问题,如背包问题。
- 分析动态规划算法的正确性,并证明其最优性。
(3)实验步骤:- 分析背包问题的动态规划策略。
- 编写动态规划算法的代码。
- 分析动态规划算法的正确性,并证明其最优性。
- 编写测试程序,验证动态规划算法的正确性。
三、实验结果与分析1. 排序算法实验结果:- 冒泡排序:时间复杂度O(n^2),空间复杂度O(1)。
算法分析与设计实验报告合并排序快速排序

算法分析与设计实验报告:合并排序与快速排序一、引言算法是计算机科学中非常重要的一部分,它涉及到解决问题的方法和步骤。
合并排序和快速排序是两种经典而常用的排序算法。
本文将对这两种排序算法进行分析和设计实验,通过对比它们的性能和效率,以期得出最优算法。
二、合并排序合并排序是一种分治算法,它将原始数组不断分解为更小的数组,直到最后细分为单个元素。
然后,再将这些单个元素两两合并,形成一个有序数组。
合并排序的核心操作是合并两个有序的数组。
1. 算法步骤(1)将原始数组分解为更小的子数组,直到每个子数组只有一个元素;(2)两两合并相邻的子数组,同时进行排序,生成新的有序数组;(3)重复步骤(2),直到生成最终的有序数组。
2. 算法性能合并排序的最优时间复杂度为O(nlogn),其中n为待排序数组的长度。
无论最好情况还是最坏情况,合并排序的复杂度都相同。
合并排序需要额外的存储空间来存储临时数组,所以空间复杂度为O(n)。
三、快速排序快速排序也是一种分治算法,它将原始数组根据一个主元(pivot)分成两个子数组,一个子数组的元素都小于主元,另一个子数组的元素都大于主元。
然后,递归地对这两个子数组进行排序,最后得到有序数组。
快速排序的核心操作是划分。
1. 算法步骤(1)选择一个主元(pivot),可以是随机选择或者固定选择第一个元素;(2)将原始数组根据主元划分为两个子数组,一个子数组的元素都小于主元,另一个子数组的元素都大于主元;(3)递归地对这两个子数组进行快速排序;(4)重复步骤(2)和(3),直到每个子数组只有一个元素,即得到最终的有序数组。
2. 算法性能快速排序的平均时间复杂度为O(nlogn),其中n为待排序数组的长度。
最坏情况下,当每次选择的主元都是最小或最大元素时,时间复杂度为O(n^2)。
快速排序是原地排序,不需要额外的存储空间,所以空间复杂度为O(1)。
四、实验设计为了验证合并排序和快速排序的性能和效率,我们设计以下实验:1. 实验目的:比较合并排序和快速排序的时间复杂度和空间复杂度。
算法与分析实验报告

算法与分析实验报告一、引言算法是现代计算机科学中的核心概念,通过合理设计的算法可以解决复杂的问题,并提高计算机程序的执行效率。
本次实验旨在通过实际操作和数据统计,对比分析不同算法的执行效率,探究不同算法对于解决特定问题的适用性和优劣之处。
二、实验内容本次实验涉及两个经典的算法问题:排序和搜索。
具体实验内容如下:1. 排序算法- 冒泡排序- 插入排序- 快速排序2. 搜索算法- 顺序搜索- 二分搜索为了对比不同算法的执行效率,我们需要设计合适的测试用例并记录程序执行时间进行比较。
实验中,我们将使用随机生成的整数数组作为排序和搜索的测试数据,并统计执行时间。
三、实验步骤1. 算法实现与优化- 实现冒泡排序、插入排序和快速排序算法,并对算法进行优化,提高执行效率。
- 实现顺序搜索和二分搜索算法。
2. 数据生成- 设计随机整数数组生成函数,生成不同大小的测试数据。
3. 实验设计- 设计实验方案,包括测试数据的规模、重复次数等。
4. 实验执行与数据收集- 使用不同算法对随机整数数组进行排序和搜索操作,记录执行时间。
- 多次重复同样的操作,取平均值以减小误差。
5. 数据分析与结果展示- 将实验收集到的数据进行分析,并展示在数据表格或图表中。
四、实验结果根据实验数据的收集与分析,我们得到以下结果:1. 排序算法的比较- 冒泡排序:平均执行时间较长,不适用于大规模数据排序。
- 插入排序:执行效率一般,在中等规模数据排序中表现良好。
- 快速排序:执行效率最高,适用于大规模数据排序。
2. 搜索算法的比较- 顺序搜索:执行时间与数据规模成线性关系,适用于小规模数据搜索。
- 二分搜索:执行时间与数据规模呈对数关系,适用于大规模有序数据搜索。
实验结果表明,不同算法适用于不同规模和类型的问题。
正确选择和使用算法可以显著提高程序的执行效率和性能。
五、实验总结通过本次实验,我们深入了解了不同算法的原理和特点,并通过实际操作和数据分析对算法进行了比较和评估。
算法冒泡排序实验报告(3篇)

第1篇一、实验目的本次实验旨在通过实现冒泡排序算法,加深对排序算法原理的理解,掌握冒泡排序的基本操作,并分析其性能特点。
二、实验内容1. 冒泡排序原理冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
遍历数列的工作是重复地进行,直到没有再需要交换,也就是说该数列已经排序完成。
2. 实验步骤(1)设计一个冒泡排序函数,输入为待排序的数组,输出为排序后的数组。
(2)编写一个主函数,用于测试冒泡排序函数的正确性和性能。
(3)通过不同的数据规模和初始顺序,分析冒泡排序的性能特点。
3. 实验环境(1)编程语言:C语言(2)开发环境:Visual Studio Code(3)测试数据:随机生成的数组、有序数组、逆序数组三、实验过程1. 冒泡排序函数设计```cvoid bubbleSort(int arr[], int n) {int i, j, temp;for (i = 0; i < n - 1; i++) {for (j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}```2. 主函数设计```cinclude <stdio.h>include <stdlib.h>include <time.h>int main() {int n;printf("请输入数组长度:");scanf("%d", &n);int arr = (int )malloc(n sizeof(int)); if (arr == NULL) {printf("内存分配失败\n");return 1;}// 生成随机数组srand((unsigned)time(NULL));for (int i = 0; i < n; i++) {arr[i] = rand() % 100;}// 冒泡排序bubbleSort(arr, n);// 打印排序结果printf("排序结果:\n");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");// 释放内存free(arr);return 0;}```3. 性能分析(1)对于随机生成的数组,冒泡排序的平均性能较好,时间复杂度为O(n^2)。
快速排序算法实验报告

快速排序算法实验报告快速排序算法实验报告引言快速排序算法是一种高效的排序算法,它的时间复杂度为O(nlogn),在实际应用中被广泛使用。
本实验旨在通过实际的实验数据,验证快速排序算法的效果和性能,并对其进行分析和总结。
实验设计本实验采用C++语言编写快速排序算法,并通过随机生成的数据进行排序实验。
实验中使用了不同规模的数据集,并记录了排序所需的时间和比较次数。
实验步骤1. 实现快速排序算法快速排序算法的核心思想是通过选取一个基准元素,将待排序的序列分为两部分,一部分比基准元素小,一部分比基准元素大,然后对这两部分继续进行快速排序。
具体实现时,可以选择序列的第一个元素作为基准元素,然后使用分治法递归地对子序列进行排序。
2. 生成测试数据为了验证快速排序算法的性能,我们生成了不同规模的随机数序列作为测试数据。
测试数据的规模分别为1000、10000、100000和1000000。
3. 进行排序实验使用生成的测试数据,对快速排序算法进行实验。
记录每次排序所需的时间和比较次数,并将结果进行统计和分析。
实验结果通过对不同规模的数据集进行排序实验,我们得到了以下结果:数据规模排序时间(ms)比较次数1000 2 872810000 12 114846100000 124 13564771000000 1483 15737267分析与讨论从实验结果可以看出,随着数据规模的增大,排序所需的时间和比较次数也呈指数级增长。
这符合快速排序算法的时间复杂度为O(nlogn)的特性。
另外,通过观察实验结果,我们可以发现快速排序算法的性能受到多个因素的影响。
首先,基准元素的选择对算法的效率有很大的影响。
如果选择的基准元素恰好是序列的中位数,那么排序的效率会更高。
其次,数据的初始顺序也会影响排序的效果。
如果数据已经是有序的,那么快速排序算法的效率将大大降低。
此外,快速排序算法还存在一些优化的空间。
例如,可以通过随机选择基准元素来避免最坏情况的发生。
快速排序算法实验报告

快速排序算法实验报告快速排序一、问题描述在操作系统中,我们总是希望以最短的时间处理完所有的任务。
但事情总是要一件件地做,任务也要操作系统一件件地处理。
当操作系统处理一件任务时,其他待处理的任务就需要等待。
虽然所有任务的处理时间不能降低,但我们可以安排它们的处理顺序,将耗时少的任务先处理,耗时多的任务后处理,这样就可以使所有任务等待的时间和最小。
只需要将n 件任务按用时去从小到大排序,就可以得到任务依次的处理顺序。
当有 n 件任务同时来临时,每件任务需要用时ni,求让所有任务等待的时间和最小的任务处理顺序。
二、需求分析1. 输入事件件数n,分别随机产生做完n件事所需要的时间;2. 对n件事所需的时间使用快速排序法,进行排序输出。
排序时,要求轴值随机产生。
3. 输入输出格式:输入:第一行是一个整数n,代表任务的件数。
接下来一行,有n个正整数,代表每件任务所用的时间。
输出:输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。
按此顺序进行,则使得所有任务等待时间最小。
4. 测试数据:输入 95 3 4 26 1 57 3 输出1 2 3 3 4 5 5 6 7三、概要设计抽象数据类型因为此题不需要存储复杂的信息,故只需一个整型数组就可以了。
算法的基本思想对一个给定的进行快速排序,首先需要选择一个轴值,假设输入的数组中有k个小于轴值的数,于是这些数被放在数组最左边的k个位置上,而大于周知的结点被放在数组右边的n-k个位置上。
k也是轴值的下标。
这样k把数组分成了两个子数组。
分别对两个子数组,进行类似的操作,便能得到正确的排序结果。
程序的流程输入事件件数n-->随机产生做完没个事件所需时间-->对n个时间进行排序-->输出结果快速排序方法:初始状态 72 6 57 88 85 42 l r第一趟循环 72 6 57 88 85 42 l r 第一次交换 6 72 57 88 85 42 l r 第二趟循环 6 72 57 88 85 42 r l 第二次交换 72 6 57 88 85 42 r l反转交换 6 72 57 88 85 42 r l这就是依靠轴值,将数组分成两部分的实例。
常见算法设计实验报告(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. 实验方法本次实验设计了四种排序算法,分别为冒泡排序、插入排序、选择排序和快速排序。
实验采用Python语言进行实现,并通过编写测试函数对算法进行验证。
测试函数会生成一定数量的随机数,并对这些随机数进行排序,统计算法的执行时间和比较次数,最后将结果进行记录和分析。
3. 测试结果及分析3.1 冒泡排序冒泡排序是一种简单且常用的排序算法,其基本思想是从待排序的数据中依次比较相邻的两个元素,如果它们的顺序不符合要求,则交换它们的位置。
经过多轮的比较和交换,最小值会逐渐冒泡到前面。
测试结果显示,冒泡排序在排序1000个随机数时,平均执行时间为0.981秒,比较次数为499500次。
从执行时间和比较次数来看,冒泡排序的性能较差,对于大规模数据的排序不适用。
3.2 插入排序插入排序是一种简单但有效的排序算法,其基本思想是将一个待排序的元素插入到已排序的子数组中的正确位置。
通过不断将元素插入到正确的位置,最终得到排序好的数组。
测试结果显示,插入排序在排序1000个随机数时,平均执行时间为0.892秒,比较次数为249500次。
插入排序的性能较好,因为其内层循环的比较次数与待排序数组的有序程度相关,对于近乎有序的数组排序效果更好。
3.3 选择排序选择排序是一种简单但低效的排序算法,其基本思想是在待排序的数组中选择最小的元素,将其放到已排序数组的末尾。
通过多次选择和交换操作,最终得到排序好的数组。
测试结果显示,选择排序在排序1000个随机数时,平均执行时间为4.512秒,比较次数为499500次。
快速排序算法实验报告

快速排序算法实验报告快速排序算法实验报告引言:快速排序算法是一种常用且高效的排序算法,它的核心思想是通过分治的思想将一个大问题分解成多个小问题,并通过递归的方式解决这些小问题。
本实验旨在通过实际实现和测试快速排序算法,探究其性能和效果。
实验目的:1. 理解快速排序算法的原理和思想;2. 掌握快速排序算法的实现方法;3. 通过实验比较快速排序算法与其他排序算法的性能差异。
实验步骤:1. 算法实现首先,我们需要实现快速排序算法。
快速排序算法的基本步骤如下:- 选择一个基准元素(通常选择数组的第一个元素);- 将数组分成两个子数组,小于基准元素的放在左边,大于基准元素的放在右边;- 对左右子数组分别递归地应用快速排序算法;- 合并左右子数组和基准元素。
代码实现如下:```pythondef quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[0]left = [x for x in arr[1:] if x < pivot]right = [x for x in arr[1:] if x >= pivot]return quick_sort(left) + [pivot] + quick_sort(right)```2. 性能测试接下来,我们将使用不同规模的随机数组进行性能测试,比较快速排序算法与其他排序算法的效率。
我们选择插入排序算法和归并排序算法作为对比算法。
首先,我们生成1000个随机整数,并分别使用快速排序算法、插入排序算法和归并排序算法进行排序。
记录下每个算法的运行时间。
然后,我们逐渐增加数组的规模,分别测试10000、100000、1000000个随机整数的排序时间。
最后,我们绘制出三种算法在不同规模下的运行时间曲线,并进行分析和比较。
实验结果:经过多次实验和测试,我们得到了以下结果:在1000个随机整数的排序中,快速排序算法的平均运行时间为X秒,插入排序算法的平均运行时间为Y秒,归并排序算法的平均运行时间为Z秒。
关于算法的实验报告(3篇)

第1篇一、实验目的1. 理解快速排序算法的基本原理和实现方法。
2. 掌握快速排序算法的时间复杂度和空间复杂度分析。
3. 通过实验验证快速排序算法的效率。
4. 提高编程能力和算法设计能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验原理快速排序算法是一种分而治之的排序算法,其基本思想是:选取一个基准元素,将待排序序列分为两个子序列,其中一个子序列的所有元素均小于基准元素,另一个子序列的所有元素均大于基准元素,然后递归地对这两个子序列进行快速排序。
快速排序算法的时间复杂度主要取决于基准元素的选取和划分过程。
在平均情况下,快速排序的时间复杂度为O(nlogn),但在最坏情况下,时间复杂度会退化到O(n^2)。
四、实验内容1. 快速排序算法的代码实现2. 快速排序算法的时间复杂度分析3. 快速排序算法的效率验证五、实验步骤1. 设计快速排序算法的C++代码实现,包括以下功能:- 选取基准元素- 划分序列- 递归排序2. 编写主函数,用于生成随机数组和测试快速排序算法。
3. 分析快速排序算法的时间复杂度。
4. 对不同规模的数据集进行测试,验证快速排序算法的效率。
六、实验结果与分析1. 快速排序算法的代码实现```cppinclude <iostream>include <vector>include <cstdlib>include <ctime>using namespace std;// 生成随机数组void generateRandomArray(vector<int>& arr, int n) {srand((unsigned)time(0));for (int i = 0; i < n; ++i) {arr.push_back(rand() % 1000);}}// 快速排序void quickSort(vector<int>& arr, int left, int right) { if (left >= right) {return;}int i = left;int j = right;int pivot = arr[(left + right) / 2]; // 选取中间元素作为基准 while (i <= j) {while (arr[i] < pivot) {i++;}while (arr[j] > pivot) {j--;}if (i <= j) {swap(arr[i], arr[j]);i++;j--;}}quickSort(arr, left, j);quickSort(arr, i, right);}int main() {int n = 10000; // 测试数据规模vector<int> arr;generateRandomArray(arr, n);clock_t start = clock();quickSort(arr, 0, n - 1);clock_t end = clock();cout << "排序用时:" << double(end - start) / CLOCKS_PER_SEC << "秒" << endl;return 0;}```2. 快速排序算法的时间复杂度分析根据实验结果,快速排序算法在平均情况下的时间复杂度为O(nlogn),在最坏情况下的时间复杂度为O(n^2)。
全排列实验报告总结

一、实验目的本次实验旨在通过编程实现全排列算法,了解全排列的基本原理,掌握不同全排列算法的优缺点,并分析其时间复杂度和空间复杂度。
二、实验内容1. 全排列算法介绍全排列是指将给定集合中的元素进行排列,使得每个元素都有且只有一个位置,且每个位置都只有一个元素。
全排列问题在计算机科学中有着广泛的应用,如密码生成、组合优化等。
2. 全排列算法实现本次实验分别实现了以下几种全排列算法:(1)递归法递归法是解决全排列问题的一种常用方法。
其基本思想是:将第一个元素固定,对剩余元素进行全排列,然后将第一个元素与剩余元素中的每一个元素进行交换,再次进行全排列。
(2)迭代法迭代法是另一种解决全排列问题的方法。
其基本思想是:使用一个数组来存储当前的排列结果,通过交换数组中的元素来生成新的排列。
(3)基于栈的迭代法基于栈的迭代法是迭代法的一种改进,利用栈结构来存储排列过程中需要交换的元素,从而提高算法的执行效率。
三、实验结果与分析1. 递归法递归法实现简单,易于理解。
然而,递归法存在一定的局限性,当给定集合较大时,递归深度较深,可能导致栈溢出。
此外,递归法的时间复杂度为O(n!),空间复杂度也为O(n!)。
2. 迭代法迭代法相较于递归法,避免了栈溢出的风险,且空间复杂度较低。
但迭代法在实现过程中,需要对数组进行多次交换操作,导致算法效率较低。
迭代法的时间复杂度为O(n!),空间复杂度为O(n)。
3. 基于栈的迭代法基于栈的迭代法结合了递归法和迭代法的优点,避免了递归法的栈溢出风险,且在实现过程中,通过栈结构优化了交换操作,提高了算法的执行效率。
基于栈的迭代法的时间复杂度为O(n!),空间复杂度为O(n)。
四、实验结论1. 全排列算法在计算机科学中有着广泛的应用,掌握全排列算法的基本原理和实现方法对于提高编程能力具有重要意义。
2. 本次实验分别实现了递归法、迭代法和基于栈的迭代法三种全排列算法,并分析了其优缺点。
在实际应用中,可根据具体情况选择合适的全排列算法。
排序算法实验报告

数据结构实验报告八种排序算法实验报告一、实验内容编写关于八种排序算法的C语言程序,要求包含直接插入排序、希尔排序、简单项选择择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序。
二、实验步骤各种内部排序算法的比较:1.八种排序算法的复杂度分析〔时间与空间〕。
2.八种排序算法的C语言编程实现。
3.八种排序算法的比较,包括比较次数、移动次数。
三、稳定性,时间复杂度和空间复杂度分析比较时间复杂度函数的情况:时间复杂度函数O(n)的增长情况所以对n较大的排序记录。
一般的选择都是时间复杂度为O(nlog2n)的排序方法。
时间复杂度来说:(1)平方阶(O(n2))排序各类简单排序:直接插入、直接选择和冒泡排序;(2)线性对数阶(O(nlog2n))排序快速排序、堆排序和归并排序;(3)O(n1+§))排序,§是介于0和1之间的常数。
希尔排序(4)线性阶(O(n))排序基数排序,此外还有桶、箱排序。
说明:当原表有序或基本有序时,直接插入排序和冒泡排序将大大减少比较次数和移动记录的次数,时间复杂度可降至O〔n〕;而快速排序则相反,当原表基本有序时,将蜕化为冒泡排序,时间复杂度提高为O〔n2〕;原表是否有序,对简单项选择择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。
稳定性:排序算法的稳定性:假设待排序的序列中,存在多个具有相同关键字的记录,经过排序,这些记录的相对次序保持不变,则称该算法是稳定的;假设经排序后,记录的相对次序发生了改变,则称该算法是不稳定的。
稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。
基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。
另外,如果排序算法稳定,可以防止多余的比较;稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序四、设计细节排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
快速排序算法实验报告

快速排序算法实验报告《快速排序算法实验报告》摘要:本实验通过对快速排序算法的理论分析和实际测试,验证了快速排序算法在处理大规模数据时的高效性和稳定性。
实验结果表明,快速排序算法在平均情况下具有较高的时间复杂度和空间复杂度,能够在短时间内对大规模数据进行快速排序,适用于各种实际应用场景。
1. 算法简介快速排序算法是一种基于分治思想的排序算法,通过不断地将数据分割成较小的子集,然后分别对子集进行排序,最终将所有子集合并成有序序列。
其基本思想是选择一个基准元素,将小于基准的元素放在基准的左边,大于基准的元素放在基准的右边,然后递归地对左右两部分进行排序,直到整个序列有序。
2. 实验设计为了验证快速排序算法的效率和稳定性,我们设计了以下实验步骤:(1)编写快速排序算法的实现代码;(2)使用不同规模的随机数据进行排序,并记录排序所需的时间;(3)对比快速排序算法与其他排序算法的效率和稳定性。
3. 实验结果我们使用C++语言编写了快速排序算法的实现代码,并对不同规模的随机数据进行了排序实验。
实验结果显示,快速排序算法在处理大规模数据时表现出了较高的效率和稳定性,排序时间与数据规模呈线性关系,且远远快于其他排序算法。
此外,快速排序算法在最坏情况下的时间复杂度为O(n^2),但在平均情况下的时间复杂度为O(nlogn),具有较好的性能表现。
4. 结论通过实验验证,我们得出了以下结论:(1)快速排序算法在处理大规模数据时具有较高的效率和稳定性;(2)快速排序算法在平均情况下具有较高的时间复杂度和空间复杂度,适用于各种实际应用场景;(3)快速排序算法在最坏情况下的时间复杂度为O(n^2),需要注意避免最坏情况的发生。
综上所述,快速排序算法是一种高效且稳定的排序算法,能够在短时间内对大规模数据进行快速排序,适用于各种实际应用场景。
在实际开发中,我们应该充分利用快速排序算法的优势,并注意避免最坏情况的发生,以提高算法的效率和稳定性。
快速排序算法实验报告

一、实验目的1. 理解快速排序算法的基本原理和实现方法。
2. 掌握快速排序算法的递归分治策略。
3. 分析快速排序算法的时间复杂度和空间复杂度。
4. 通过实验验证快速排序算法的性能。
二、实验内容本实验主要涉及快速排序算法的原理、实现和性能分析。
实验内容包括:1. 快速排序算法的基本原理。
2. 快速排序算法的递归分治策略。
3. 快速排序算法的时间复杂度和空间复杂度分析。
4. 快速排序算法的C语言实现。
5. 快速排序算法的性能测试。
三、实验原理快速排序算法是一种高效的排序算法,其基本思想是选取一个基准元素(pivot),将待排序的序列划分为两部分,使得左边的部分都小于等于基准元素,右边的部分都大于等于基准元素。
然后递归地对左右两部分分别进行快速排序,直到整个序列有序。
快速排序算法的递归分治策略如下:1. 选择基准元素:在待排序序列中选取一个元素作为基准元素。
2. 分区操作:将待排序序列划分为两部分,使得左边的部分都小于等于基准元素,右边的部分都大于等于基准元素。
3. 递归排序:分别对左右两部分递归进行快速排序。
四、实验步骤1. 快速排序算法的C语言实现```c#include <stdio.h>void swap(int a, int b) {int temp = a;a = b;b = temp;}int partition(int arr[], int low, int high) { int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high - 1; j++) {if (arr[j] < pivot) {i++;swap(&arr[i], &arr[j]);}}swap(&arr[i + 1], &arr[high]);return (i + 1);}void quickSort(int arr[], int low, int high) { if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}}void printArray(int arr[], int size) {int i;for (i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");}int main() {int arr[] = {10, 7, 8, 9, 1, 5};int n = sizeof(arr) / sizeof(arr[0]);quickSort(arr, 0, n - 1);printf("Sorted array: \n");printArray(arr, n);return 0;}```2. 快速排序算法的性能测试为了测试快速排序算法的性能,我们可以对不同的输入数据量进行排序,并记录排序所需的时间。
排序实验报告的结果总结(3篇)

第1篇一、实验背景随着计算机科学和信息技术的发展,排序算法在数据处理的领域中扮演着至关重要的角色。
本实验旨在通过对比几种常见的排序算法,分析它们的性能差异,为实际应用中选择合适的排序算法提供参考。
二、实验目的1. 熟悉几种常见排序算法的基本原理和实现方法。
2. 分析不同排序算法的时间复杂度和空间复杂度。
3. 比较不同排序算法在不同数据规模下的性能差异。
4. 为实际应用提供选择排序算法的依据。
三、实验方法1. 选择实验数据:随机生成一组包含10000个整数的数组,分别用于测试不同排序算法的性能。
2. 实现排序算法:分别实现冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等常见排序算法。
3. 性能测试:分别对每组实验数据进行排序,记录每种排序算法的运行时间。
4. 数据分析:对比不同排序算法的时间复杂度和空间复杂度,分析其性能差异。
四、实验结果1. 冒泡排序冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。
在测试数据规模为10000时,冒泡排序的运行时间为234.5秒。
2. 选择排序选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。
在测试数据规模为10000时,选择排序的运行时间为237.1秒。
3. 插入排序插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。
在测试数据规模为10000时,插入排序的运行时间为239.8秒。
4. 快速排序快速排序的平均时间复杂度为O(nlogn),空间复杂度为O(logn)。
在测试数据规模为10000时,快速排序的运行时间为18.5秒。
5. 归并排序归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。
在测试数据规模为10000时,归并排序的运行时间为20.3秒。
6. 堆排序堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。
在测试数据规模为10000时,堆排序的运行时间为19.7秒。
五、结果分析1. 时间复杂度方面:快速排序、归并排序和堆排序的平均时间复杂度均为O(nlogn),优于冒泡排序、选择排序和插入排序的O(n^2)时间复杂度。
查找排序算法实验报告(3篇)

第1篇一、实验目的1. 熟悉常见的查找和排序算法。
2. 分析不同查找和排序算法的时间复杂度和空间复杂度。
3. 比较不同算法在处理大数据量时的性能差异。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm三、实验内容1. 实现以下查找和排序算法:(1)查找算法:顺序查找、二分查找(2)排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序2. 分析算法的时间复杂度和空间复杂度。
3. 对不同算法进行性能测试,比较其处理大数据量时的性能差异。
四、实验步骤1. 实现查找和排序算法。
2. 分析算法的时间复杂度和空间复杂度。
3. 创建测试数据,包括小数据量和大数据量。
4. 对每种算法进行测试,记录运行时间。
5. 分析测试结果,比较不同算法的性能。
五、实验结果与分析1. 算法实现(1)顺序查找def sequential_search(arr, target): for i in range(len(arr)):if arr[i] == target:return ireturn -1(2)二分查找def binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -1(3)冒泡排序def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j](4)选择排序def selection_sort(arr):n = len(arr)for i in range(n):min_idx = ifor j in range(i+1, n):if arr[min_idx] > arr[j]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i](5)插入排序def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i-1while j >=0 and key < arr[j]:arr[j+1] = arr[j]j -= 1arr[j+1] = key(6)快速排序def quick_sort(arr):if len(arr) <= 1:pivot = arr[len(arr) // 2]left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort(left) + middle + quick_sort(right)(7)归并排序def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):result = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i += 1else:result.append(right[j])result.extend(left[i:])result.extend(right[j:])return result2. 算法时间复杂度和空间复杂度分析(1)顺序查找:时间复杂度为O(n),空间复杂度为O(1)。
排序实验报告

排序实验报告一、实验目的本次排序实验的主要目的是探究和比较不同排序算法在处理不同规模数据时的性能表现,包括时间复杂度和空间复杂度,并深入理解排序算法的工作原理和特点。
二、实验环境本次实验使用的编程语言为Python,运行环境为Jupyter Notebook。
实验中所用到的主要库包括`time` 用于计算算法的运行时间,`random` 用于生成随机测试数据。
三、实验原理(一)冒泡排序冒泡排序(Bubble Sort)是一种简单的排序算法。
它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。
(二)插入排序插入排序(Insertion Sort)是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,直到未排序数据为空。
(三)选择排序选择排序(Selection Sort)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
(四)快速排序快速排序(Quick Sort)是对冒泡排序的一种改进。
它采用分治的思想,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列有序。
四、实验步骤(一)生成测试数据为了全面测试排序算法的性能,我们生成了不同规模的随机整数数组作为测试数据。
分别生成了包含 100、500、1000、5000 和 10000 个元素的数组。
(二)实现排序算法使用 Python 实现了上述四种排序算法,确保每个算法的功能正确。
(三)测试算法性能对于每种规模的测试数据,分别使用四种排序算法进行排序,并记录每种算法的运行时间。
五、实验结果与分析(一)时间复杂度分析1、冒泡排序:在最坏情况下,时间复杂度为$O(n^2)$,当数据规模较小时,其性能尚可,但随着数据规模的增大,运行时间显著增加。
快速排序实验报告心得(3篇)

第1篇一、实验背景随着计算机科学的发展,算法在各个领域都扮演着至关重要的角色。
排序算法作为算法领域中的一项基本技能,其重要性不言而喻。
快速排序作为一种高效的排序算法,因其简洁的原理和良好的性能,被广泛应用于各种场景。
本次实验旨在通过实践,深入了解快速排序算法的原理、实现及其性能特点。
二、实验目的1. 掌握快速排序算法的基本原理和实现方法;2. 分析快速排序算法的时间复杂度和空间复杂度;3. 比较快速排序与其他排序算法的性能差异;4. 熟练运用快速排序算法解决实际问题。
三、实验内容1. 快速排序算法原理及实现快速排序是一种分而治之的排序算法,其基本思想是:选取一个基准元素,将待排序序列划分为两个子序列,一个子序列中的所有元素均小于等于基准元素,另一个子序列中的所有元素均大于等于基准元素。
然后递归地对这两个子序列进行快速排序。
具体实现步骤如下:(1)选择基准元素:从待排序序列中选取一个元素作为基准元素,通常选择序列的第一个或最后一个元素。
(2)划分:将待排序序列划分为两个子序列,左子序列包含小于等于基准元素的元素,右子序列包含大于等于基准元素的元素。
(3)递归排序:递归地对左子序列和右子序列进行快速排序。
2. 快速排序算法性能分析快速排序算法的平均时间复杂度为O(nlogn),最坏情况下的时间复杂度为O(n^2)。
空间复杂度为O(logn),因为快速排序采用递归实现,需要一定的栈空间。
3. 快速排序与其他排序算法的比较与冒泡排序、插入排序等简单排序算法相比,快速排序具有以下优点:(1)时间复杂度较低,适用于大规模数据的排序;(2)空间复杂度较低,节省内存资源;(3)对数据结构无特殊要求,适用于各种数据类型。
然而,快速排序也存在以下缺点:(1)最坏情况下的时间复杂度较高,当数据量较大且分布不均匀时,性能可能不如其他排序算法;(2)递归实现可能导致栈溢出,对数据量较大的排序任务不适用。
四、实验总结通过本次实验,我对快速排序算法有了更深入的了解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《排序问题求解》实验报告一、算法的基本思想1、直接插入排序算法思想直接插入排序的基本思想是将一个记录插入到已排好序的序列中,从而得到一个新的,记录数增 1 的有序序列。
直接插入排序算法的伪代码称为 InsertionSort,它的参数是一个数组 A[1..n],包含了 n个待排序的数。
用伪代码表示直接插入排序算法如下:InsertionSort (A)for i←2 to ndo key←A[i] //key 表示待插入数//Insert A[i] into the sorted sequence A[1..i-1]j←i-1while j>0 and A[j]>keydo A[j+1]←A[j]j←j-1A[j+1]←key2、快速排序算法思想快速排序算法的基本思想是,通过一趟排序将待排序序列分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序。
假设待排序序列为数组 A[1..n],首先选取第一个数 A[0],作为枢轴(pivot),然后按照下述原则重新排列其余数:将所有比 A[0]大的数都排在它的位置之前,将所有比 A[0]小的数都排在它的位置之后,由此以 A[0]最后所在的位置 i 作为分界线,将数组 A[1..n]分成两个子数组 A[1..i-1]和 A[i+1..n]。
这个过程称作一趟快速排序。
通过递归调用快速排序,对子数组A[1..i-1]和 A[i+1..n]排序。
一趟快速排序算法的伪代码称为 Partition,它的参数是一个数组 A[1..n]和两个指针low、high,设枢轴为 pivotkey,则首先从 high 所指位置起向前搜索,找到第一个小于pivotkey 的数,并将其移到低端,然后从 low 所指位置起向后搜索,找到第一个大于pivotkey 的数,并将其移到高端,重复这两步直至 low=high。
最后,将枢轴移到正确的位置上。
用伪代码表示一趟快速排序算法如下:Partition ( A, low, high)A[0]←A[low]//用数组的第一个记录做枢轴记录privotkey←A[low]//枢轴记录关键字while low<high //从表的两端交替地向中间扫描while low<high && A[high]>=privotkey do high←high-1A[low]←A[high] //将比枢轴记录小的记录移到低端while low<high && A[low]<=pivotkey) do low←low+1A[high]←A[low] //将比枢轴记录大的记录移到高端A[low]←A[0] //枢轴记录到位return low //返回枢轴位置二、算法的理论分析1. 直接插入排序算法理论分析从空间来看,直接插入排序只需要一个数的辅助空间;从时间来看,直接插入排序的基本操作为:比较两个关键字的大小和移动记录。
先分析一趟直接插入排序的情况。
伪代码InsertionSort 中 while 循环的次数取决于待插入的数与前 i-1 个数之间的关系。
若A[i]<A[0],则在 while 循环中,待插入数需与有序数组 A[1..i-1]中 i-1 个数进行比较,并将 A[i-1]中 i-1 个数后移。
则在整个排序过程(进行 n-1 趟插入排序)中,当待排序数组中数按非递减有序排列时,则需进行数间比较次数达最小值 n-1,数不需要移动;反之,当待排序数组中数按非递增有序排列时,总的比较次数达最大值(n+2)(n-1)/2,数移动的次数也达到最大值(n+4)(n-1)/2。
若待排序数组是随机的,即待排序数组中的数可能出现的各种排序的概率相同,则我们可取上述最小值和最大值的平均值,作为直接插入排序时所需进行数间的比较次数和数的移动次数,约为 n^2/4。
因此直接插入排序算法,在最佳情况下的时间复杂度是 O(n),在最坏情况下的时间复杂度为 O(n^2)。
2. 快速排序算法理论分析下面我们来分析快速排序的平均时间性能。
假设 T(n)为对 n 个记录 A[1..n]进行快速排序所需时间,则由算法 QuickSort 可见:其中,Tpass(n)为对 n 个记录进行一趟快速排序 Partition(A,1,n)所需的时间,从一趟快速排序算法可见,其和记录数 n 成正比,可以用表示(c 为某个常数);T(k-1)和 T (n-k)分别为对 A[1..k-1]和 A[k+1..n]中记录进行快速排序 QuickSort(A,1,k-1)和QuickSort(A,k+1,n)所需时间。
假设待排序列中记录是随机排列的,则在一趟排序之后,k 取 1 至 n 之间任何一值的概率相同,快速排序所需时间的平均值则为Tavg(n)=knInn,其中 n 为待排序序列中记录的个数,k 为某个常数。
通常,快速排序被认为是,在所有同数量级(O(nlogn))的排序方法中,其平均性能最好。
但是,若初始记录序列按关键字有序或基本有序时,快速排序将蜕化为起泡排序,其时间复杂度为 O(n^2)。
三、试验分析1、试验环境WIN 32系统,VC6.02、程序的执行1)由函数 datagenetare()生成 20000 个在区间[1,100000]上的随机整数,并将随机整数保存到数组 num[],接着调用函数 WriteFile()将这些数输出到外部文件 data.txt 中。
2)调用函数 ReadFile()从 data.txt 中读取数据,并将其保存到数组 num1[]中。
接着对数组 num1 进行直接插入排序,并计算和记录其运行时间。
最后,调用函数 WriteFile()将直接插入排序的结果写入 resultsIS.txt,并记录运行时间为 TimeIS。
3)调用函数 ReadFile()从 data.txt 中读取数据,并将其保存到数组 num2[]中。
接着对数组 num2 进行快速排序,并计算和记录其运行时间。
最后,调用函数 WriteFile()将快速排序的结果写入 resultsQS.txt,并记录运行时间为 TimeQS。
3、试验数据当N=20000时:当N=30000时:当N=40000时:当N=50000时:当N=60000时:当N=70000时:当N=80000时:做出折线统计图四、试验心得通过本次试验首先对在C++下的文件操作有了一定的深入认识,对于快速排序和插入排序的时间有了相当清晰且一目了然的认识,并且从原理上明白了快速排序的快的原因,对各种排序算法的优劣性有了全局的认识!五、实验代码#include <iostream>#include <ctime>#include <cstdlib>#include <fstream>#include <string>using namespace std;const int NumS = 80000;void datagenetare(int num[],int n); //产生随机数,保存到数组numvoid WriteFile(int num[],char name[],int n); //输出数组num到data.txt文件void ReadFile(int num[],char name[]);//读取名为name文件中的数据,保存到数组num void QuickSort(int arr[], int n);//将数组arr[]中数据快速排序void InsertionSort(int arr[],int n);//将数组arr[]中数据直接插入排序int main(){int *num=(int *)malloc(sizeof(int)*NumS);int *num1=(int *)malloc(sizeof(int)*NumS);int *num2=(int *)malloc(sizeof(int)*NumS);clock_t start_time1,end_time1,start_time2,end_time2;double timeQS=0,timeIS=0;cout<<"Create "<<NumS<<" random numbers from 1 to 100000"<<endl;datagenetare(num,NumS); //产生随机数,保存到数组numWriteFile(num,"data.txt",NumS); //输出数组到data.txt文件cout.precision(6); //设置浮点数的显示精度cout.setf(ios_base::showpoint); //输出末尾的//直接插入排序的分析ReadFile(num1,"data.txt");//读取data.txt中的数据,保存到数组num1cout<<"\nInsertionSort Start ....\n";start_time1=clock(); //开始计时InsertionSort(num1,NumS); //直接插入排序数组num1中的数据end_time1=clock(); //结束计时timeIS=(double)(end_time1-start_time1)/CLOCKS_PER_SEC;cout<<"The Time-comsuption in InsertionSort is "<<timeIS<<" seconds!\n\n"; //输出运行时间WriteFile(num1,"resultsIS.txt",NumS); //排序后的数据输出到resultQS.txt//输出运行时间timeIS到resultsIS.txtofstream ocout;ocout.open("resultsIS.txt",ios::app);if(ocout.good()) //打开resultsIS.txt{ocout<<"\nThe Time-comsuption in InsertionSort is "<<timeIS<<" seconds\n";ocout.close();}else{cout<<"\nCan not open resultsIS.txt!\n";exit(1); //异常退出}//快速排序的分析ReadFile(num2,"data.txt"); //读取data.txt中的数据,保存到数组num2[]cout<<"QuickSort Start .....\n";start_time2=clock(); //开始计时QuickSort(num2,NumS); //快速排序数组num中的数据end_time2=clock(); //结束计时timeQS=(double)(end_time2-start_time2)/CLOCKS_PER_SEC;cout<<"The Time-comsuption in QuickSort is "<<timeQS<<" seconds:\n"; //输出运行时间WriteFile(num2,"resultsQS.txt",NumS); //排序后的数据输出到resultQS.txt//输出运行时间timeQS到resultsQS.txtocout.open("resultsQS.txt",ios::app);if(ocout.good()) //打开resultsIS.txt{ocout<<"\nThe Time-comsuption in QuickSort is "<<timeQS<<" seconds\n";ocout.close();}else{cout<<"\nCan not open resultsQS.txt!\n";exit(1); //异常退出}return 0;}void datagenetare(int *num,int n){int i;srand((unsigned)time(0)); //srand()种子发生器函数,还有rand()随机数生成器函数for(i=0;i<n;i++) //产生个到之间的随机数num[i]=rand()%9999+1;printf("\n");}//将数组中的数据输出到文件void WriteFile(int *num,char name[],int n){ofstream ocout;ocout.open(name,ios::trunc);int i=0;if(ocout.fail())exit(1); //打开文件失败,退出for(;i<n;i++){ocout<<num[i]<<" ";if((i+1)%40==0||i==n-1) //每输出40个数,换一行ocout<<"\n";}ocout.close();}//将文件中的数据输入到数组void ReadFile(int *num,char name[]){string strLine;int i=0;char achLine[300];const char* pchTok;ifstream icin;icin.open(name,ios::in); //打开名为name的文件while(icin.good()){int i = 0;while(getline(icin,strLine)){strLine.copy(achLine,strLine.size(),0);achLine[strLine.size()]='\0';//每行中的元素以空格为标识断开转换为int类型后存入数组pchTok = strtok(achLine, " ");while((pchTok != NULL)){num[i] = atoi(pchTok);i++;pchTok = strtok(NULL, " ");}}}icin.close();}//快速排序的实现,从左向右递增排序void QuickSort(int *arr, int n){int L = 0;int R = n-1;int t = arr[L]; //区间的第一个数作为基准if(n<=1) //数组中存在个或个数据时,函数返回return;//将数据分成两个区间while(L<R){ //区间至少存在一个元素的情况while(L<R&&t<=arr[R]) R--;//从右向左搜索,直到第一个小于t的数arr[R]arr[L] = arr[R];while(L<R&&arr[L]<=t) L++;//从左向右搜索,找到第一个大于t的数arr[L]arr[R] = arr[L];}arr[L] = t;QuickSort(arr, L); //对左区间递归排序QuickSort(arr+L+1,n-L-1);//对右区间递归排序}//直接插入排序的实现,从左向右递增排序void InsertionSort(int *arr,int n){int i=0,temp=0,j=0;if(n<=1)return;for(i=1;i<n;++i){temp=arr[i]; //temp记录要插入的数据arr[i]j=i; //要插入的数据的位置for(;j>0&&arr[j-1]>temp;--j) //将a[i]插入到已排序的arr[0]~arr[i-1]中{arr[j]=arr[j-1]; //比temp大的数据依次后移.. ..}arr[j]=temp; //找到第一个不大于于temp的数据,在j处插入arr[i] }}. . . .。