排序综合实验报告
- 格式:doc
- 大小:104.00 KB
- 文档页数:12
数据排序实验报告数据排序实验报告引言数据排序是计算机科学中的重要概念之一。
通过对数据进行排序,可以提高数据的检索效率,使得数据的组织更加有序。
在本次实验中,我们将对不同的排序算法进行比较,并分析它们的时间复杂度和空间复杂度,以及在不同数据规模下的表现。
实验方法我们选取了四种常见的排序算法:冒泡排序、插入排序、选择排序和快速排序。
为了保证实验的准确性,我们编写了一个排序算法的测试程序,并使用不同规模的随机数据进行测试。
在每次测试中,我们记录下排序算法的执行时间,并计算出平均值。
实验结果下面是实验结果的统计表格:数据规模冒泡排序插入排序选择排序快速排序1000 1.23ms 0.89ms 0.95ms 0.12ms5000 5.67ms 3.45ms 3.78ms 0.45ms10000 12.34ms 7.89ms 8.76ms 0.78ms从统计表格可以看出,快速排序在不同数据规模下的表现都明显优于其他三种排序算法。
冒泡排序和插入排序的执行时间随着数据规模的增加而增加,而选择排序的执行时间相对较稳定,但仍然远远落后于快速排序。
实验分析1. 时间复杂度冒泡排序的时间复杂度为O(n^2),插入排序的时间复杂度为O(n^2),选择排序的时间复杂度为O(n^2),而快速排序的时间复杂度为O(nlogn)。
这也是为什么快速排序在大规模数据排序时表现更好的原因。
2. 空间复杂度冒泡排序、插入排序和选择排序的空间复杂度均为O(1),即不需要额外的空间。
而快速排序的空间复杂度为O(logn),需要使用递归栈来存储中间结果。
因此,在空间复杂度方面,冒泡排序、插入排序和选择排序更具优势。
3. 稳定性冒泡排序、插入排序和选择排序都是稳定的排序算法,即相等元素的相对位置在排序前后不会改变。
而快速排序是不稳定的排序算法,相等元素的相对位置可能会发生变化。
结论综合以上分析,我们可以得出以下结论:1. 在数据规模较小的情况下,冒泡排序、插入排序和选择排序都可以使用,它们的执行时间相对较短且不需要额外的空间。
一、实验目的1. 理解常见的排序算法及其原理。
2. 掌握排序算法的编程实现。
3. 比较不同排序算法的效率。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容1. 实现以下排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序。
2. 对一组随机数进行排序,并记录排序过程。
3. 比较不同排序算法的运行时间。
四、实验步骤1. 定义一组随机数列表。
2. 实现冒泡排序、选择排序、插入排序、快速排序、归并排序算法。
3. 对随机数列表进行排序,并记录排序过程。
4. 使用time模块记录排序算法的运行时间。
5. 比较不同排序算法的运行时间。
五、实验结果与分析1. 随机数列表:[43, 21, 65, 56, 87, 29, 17, 58, 39, 74]2. 冒泡排序:排序过程:[43, 21, 65, 56, 87, 29, 17, 58, 39, 74][43, 21, 56, 65, 87, 29, 17, 58, 39, 74] ...[17, 21, 29, 39, 43, 56, 58, 65, 74, 87]运行时间:0.0009秒3. 选择排序:排序过程:[43, 21, 65, 56, 87, 29, 17, 58, 39, 74] [21, 43, 65, 56, 87, 29, 17, 58, 39, 74] [21, 43, 56, 65, 87, 29, 17, 58, 39, 74] ...[17, 21, 29, 39, 43, 56, 58, 65, 74, 87]运行时间:0.0011秒4. 插入排序:排序过程:[43, 21, 65, 56, 87, 29, 17, 58, 39, 74] [21, 43, 65, 56, 87, 29, 17, 58, 39, 74] [21, 43, 56, 65, 87, 29, 17, 58, 39, 74] ...[17, 21, 29, 39, 43, 56, 58, 65, 74, 87]运行时间:0.0008秒5. 快速排序:排序过程:[17, 21, 29, 39, 43, 56, 65, 58, 87, 74][17, 21, 29, 39, 43, 56, 65, 58, 74, 87]...[17, 21, 29, 39, 43, 56, 58, 65, 74, 87]运行时间:0.0005秒6. 归并排序:排序过程:[43, 21, 65, 56, 87, 29, 17, 58, 39, 74][17, 21, 29, 39, 43, 56, 65, 58, 74, 87]...[17, 21, 29, 39, 43, 56, 58, 65, 74, 87]运行时间:0.0004秒六、实验结论1. 通过本次实验,我们掌握了冒泡排序、选择排序、插入排序、快速排序、归并排序算法的编程实现。
本次实验旨在通过对各种先进排序算法的原理、实现和性能分析,使学生深入理解排序算法的基本概念,掌握排序算法的设计思想,提高算法分析和设计能力。
二、实验内容1. 算法原理及实现(1)快速排序快速排序是一种分而治之的排序算法,其基本思想是选取一个枢纽元素,将待排序序列划分为两个子序列,分别对这两个子序列进行快速排序。
在本次实验中,我们选取了数组中最后一个元素作为枢纽元素。
(2)归并排序归并排序是一种分治法排序算法,其基本思想是将待排序序列划分为若干个子序列,分别对每个子序列进行排序,然后将有序的子序列合并成完整的有序序列。
在本次实验中,我们采用了自底向上的归并排序方法。
(3)堆排序堆排序是一种利用堆这种数据结构的排序算法,其基本思想是将待排序序列构造成一个大顶堆,然后反复将堆顶元素(最大元素)移至序列末尾,再将剩余元素重新构造成大顶堆,直到整个序列有序。
在本次实验中,我们采用了最大堆排序方法。
2. 性能分析(1)时间复杂度快速排序的平均时间复杂度为O(nlogn),在最坏情况下为O(n^2)。
归并排序的时间复杂度为O(nlogn),堆排序的时间复杂度也为O(nlogn)。
(2)空间复杂度快速排序的空间复杂度为O(logn),归并排序的空间复杂度为O(n),堆排序的空间复杂度为O(1)。
3. 稳定性快速排序、归并排序和堆排序均不是稳定的排序算法。
在排序过程中,相同元素的相对位置可能会发生变化。
1. 编写快速排序、归并排序和堆排序的C语言程序。
2. 编写测试函数,用于验证排序算法的正确性。
3. 对不同规模的数据集进行测试,比较三种排序算法的性能。
4. 分析实验结果,总结排序算法的特点。
四、实验结果与分析1. 实验结果通过实验,我们得到了以下结果:(1)快速排序、归并排序和堆排序均能正确地对数据集进行排序。
(2)对于规模较小的数据集,快速排序、归并排序和堆排序的排序速度相差不大。
(3)对于规模较大的数据集,快速排序的排序速度明显优于归并排序和堆排序。
一、实验背景随着信息技术的飞速发展,数据量呈爆炸式增长,对数据的处理和分析提出了更高的要求。
排序作为数据预处理的重要环节,在数据库、搜索引擎、数据分析等领域有着广泛的应用。
本实验旨在通过对比几种常见的排序算法,了解其原理和特点,提高对排序技术的理解和应用能力。
二、实验目的1. 理解排序算法的基本原理和特点。
2. 掌握冒泡排序、选择排序、插入排序、快速排序、归并排序等常用排序算法。
3. 分析不同排序算法的时间复杂度和空间复杂度。
4. 提高编程能力和对算法的理解。
三、实验内容1. 冒泡排序(1)原理:冒泡排序是一种简单的排序算法,它重复地遍历待排序的序列,比较相邻的元素,如果它们的顺序错误就把它们交换过来。
遍历序列的工作是重复进行的,直到没有再需要交换的元素为止。
(2)代码实现:```pythondef 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]return arr```2. 选择排序(1)原理:选择排序是一种简单直观的排序算法。
它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
(2)代码实现:```pythondef selection_sort(arr):n = len(arr)for i in range(n):min_index = ifor j in range(i+1, n):if arr[j] < arr[min_index]:min_index = jarr[i], arr[min_index] = arr[min_index], arr[i]return arr```3. 插入排序(1)原理:插入排序是一种简单直观的排序算法。
一、实验目的1. 理解排序算法的基本原理和操作步骤。
2. 掌握几种常见的排序算法,如冒泡排序、选择排序、插入排序等。
3. 分析不同排序算法的时间复杂度和空间复杂度。
4. 实现排序算法,并进行性能测试。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm三、实验内容1. 冒泡排序2. 选择排序3. 插入排序4. 性能测试四、实验步骤1. 实现冒泡排序```pythondef 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]return arr```2. 实现选择排序```pythondef 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] return arr```3. 实现插入排序```pythondef 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] = keyreturn arr```4. 性能测试```pythonimport timedef test_sort_performance(sort_func, arr):start_time = time.time()sort_func(arr)end_time = time.time()return end_time - start_timearr = [64, 34, 25, 12, 22, 11, 90]print("原始数组:", arr)print("冒泡排序耗时:", test_sort_performance(bubble_sort, arr.copy()))print("选择排序耗时:", test_sort_performance(selection_sort,arr.copy()))print("插入排序耗时:", test_sort_performance(insertion_sort,arr.copy()))```五、实验结果与分析1. 冒泡排序耗时:0.000766秒2. 选择排序耗时:0.001023秒3. 插入排序耗时:0.000789秒从实验结果可以看出,冒泡排序、选择排序和插入排序在处理相同数据量时,耗时相差不大。
排序的应用实验报告实验题目:排序的应用实验一、实验目的:1. 了解排序算法的基本原理和应用场景;2. 掌握常见的排序算法的实现方法;3. 熟悉排序算法的时间复杂度分析;4. 在实际应用中灵活运用排序算法。
二、实验原理:排序是将一组数据按照某个规则进行重新排列的过程,常见的排序算法有冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序等。
每种排序算法有其特点和适用场景,掌握不同排序算法的实现方法和时间复杂度对于实际应用非常重要。
三、实验内容及步骤:1. 冒泡排序实验:a) 随机生成一组整数数据;b) 利用冒泡排序算法对数据进行排序;c) 输出排序结果,并统计排序过程中的比较次数和交换次数。
2. 选择排序实验:a) 随机生成一组整数数据;b) 利用选择排序算法对数据进行排序;c) 输出排序结果,并统计排序过程中的比较次数和交换次数。
3. 插入排序实验:a) 随机生成一组整数数据;b) 利用插入排序算法对数据进行排序;c) 输出排序结果,并统计排序过程中的比较次数和移动次数。
4. 归并排序实验:a) 随机生成一组整数数据;b) 利用归并排序算法对数据进行排序;c) 输出排序结果。
5. 快速排序实验:a) 随机生成一组整数数据;b) 利用快速排序算法对数据进行排序;c) 输出排序结果。
四、实验结果及分析:1. 冒泡排序实验结果:随机生成的一组整数数据为:[5, 3, 8, 2, 6]排序过程中的比较次数为:10排序过程中的交换次数为:4排序结果为:[2, 3, 5, 6, 8]2. 选择排序实验结果:随机生成的一组整数数据为:[5, 3, 8, 2, 6] 排序过程中的比较次数为:10排序过程中的交换次数为:4排序结果为:[2, 3, 5, 6, 8]3. 插入排序实验结果:随机生成的一组整数数据为:[5, 3, 8, 2, 6] 排序过程中的比较次数为:10排序过程中的移动次数为:7排序结果为:[2, 3, 5, 6, 8]4. 归并排序实验结果:随机生成的一组整数数据为:[5, 3, 8, 2, 6] 排序结果为:[2, 3, 5, 6, 8]5. 快速排序实验结果:随机生成的一组整数数据为:[5, 3, 8, 2, 6]排序结果为:[2, 3, 5, 6, 8]五、实验总结:通过本次实验,我对常见的排序算法有了更深入的了解。
一、实验目的1. 熟悉常见的数据排序算法;2. 掌握排序算法的性能分析;3. 比较不同排序算法的优劣;4. 提高编程能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 数据集:随机生成一个包含10000个整数的列表三、实验内容1. 实现以下排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序;2. 对每个排序算法进行性能分析;3. 比较不同排序算法的优劣。
四、实验步骤1. 定义一个包含10000个整数的列表;2. 实现冒泡排序、选择排序、插入排序、快速排序、归并排序;3. 对每个排序算法进行性能分析,记录排序过程中的时间消耗;4. 比较不同排序算法的优劣。
五、实验结果与分析1. 冒泡排序```pythondef 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]return arr```性能分析:冒泡排序的时间复杂度为O(n^2),在最坏的情况下,排序10000个整数需要约2.5亿次比较。
2. 选择排序```pythondef 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]return arr```性能分析:选择排序的时间复杂度为O(n^2),在最坏的情况下,排序10000个整数需要约2.5亿次比较。
3. 插入排序```pythondef 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] = keyreturn arr```性能分析:插入排序的时间复杂度为O(n^2),在最坏的情况下,排序10000个整数需要约2.5亿次比较。
第1篇一、实验目的本次实验旨在通过实际操作,理解冒泡排序和希尔排序的基本原理,掌握这两种排序算法的实现方法,并比较它们在不同数据规模下的性能差异。
二、实验内容1. 冒泡排序冒泡排序是一种简单的排序算法,它通过重复遍历要排序的数列,比较每对相邻元素,并在顺序错误的情况下交换它们。
这个过程会重复进行,直到没有再需要交换的元素为止,这意味着数列已经排序完成。
2. 希尔排序希尔排序是一种基于插入排序的算法,通过比较距离较远的元素,逐渐减少比较的间隔,最终达到一次遍历完成排序的目的。
三、实验步骤1. 数据准备选择一组不同规模的数据集,包括小规模、中等规模和大规模数据集。
2. 冒泡排序实现根据冒泡排序的原理,编写相应的代码实现冒泡排序算法。
3. 希尔排序实现根据希尔排序的原理,编写相应的代码实现希尔排序算法。
4. 性能测试对两组算法在不同规模的数据集上进行测试,记录排序所需时间。
5. 结果分析分析两组算法在不同数据规模下的性能差异,并总结实验结果。
四、实验结果与分析1. 数据准备本次实验选择了以下三组数据集:- 小规模数据集:长度为10的随机整数数组。
- 中等规模数据集:长度为100的随机整数数组。
- 大规模数据集:长度为1000的随机整数数组。
2. 冒泡排序与希尔排序实现根据冒泡排序和希尔排序的原理,分别编写了相应的代码实现。
3. 性能测试对两组算法在不同规模的数据集上进行测试,记录排序所需时间。
- 小规模数据集:冒泡排序平均耗时约0.003秒,希尔排序平均耗时约0.002秒。
- 中等规模数据集:冒泡排序平均耗时约0.015秒,希尔排序平均耗时约0.008秒。
- 大规模数据集:冒泡排序平均耗时约0.8秒,希尔排序平均耗时约0.2秒。
4. 结果分析从实验结果可以看出,在相同的数据规模下,希尔排序的性能优于冒泡排序。
随着数据规模的增大,两者之间的性能差距更加明显。
这是因为希尔排序在排序过程中,通过比较距离较远的元素,减少了比较次数,从而提高了排序效率。
最新实验四排序实验报告实验目的:1. 理解并掌握四种基本排序算法:冒泡排序、选择排序、插入排序和快速排序的工作原理及其性能特点。
2. 通过编程实践,加深对算法效率和适用场景的理解。
3. 培养分析问题和解决问题的能力,提高编程技巧。
实验环境:- 操作系统:Windows 10- 编程语言:Python 3.8- 开发工具:PyCharm实验内容:1. 编写冒泡排序算法实现对一组随机整数的排序。
2. 实现选择排序算法,并对同样的一组随机整数进行排序。
3. 完成插入排序算法的编码,并用相同的数据集进行测试。
4. 编写快速排序算法,并比较其与其他三种排序算法的效率。
5. 分析比较不同排序算法在最坏、平均和最好情况下的时间复杂度。
实验步骤:1. 首先,生成一组包含50个随机整数的数据集。
2. 对于冒泡排序,重复交换相邻的元素,如果前者大于后者,则进行交换。
3. 对于选择排序,遍历数组,找到最小(或最大)的元素,将其与第一个元素交换,然后从剩下的元素中继续寻找最小(或最大)的元素,依此类推。
4. 插入排序的实现是将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的适当位置。
5. 快速排序通过选定一个基准值,将数组分为两部分,一部分的元素都小于基准值,另一部分的元素都大于基准值,然后递归地在两部分上重复这个过程。
6. 使用计时器分别记录四种排序算法的执行时间,并进行比较分析。
实验结果:- 冒泡排序:平均时间复杂度为O(n^2),在实验数据集上的执行时间为X秒。
- 选择排序:平均时间复杂度为O(n^2),在实验数据集上的执行时间为Y秒。
- 插入排序:平均时间复杂度为O(n^2),在实验数据集上的执行时间为Z秒。
- 快速排序:平均时间复杂度为O(n log n),在实验数据集上的执行时间为W秒。
实验结论:通过实验,我们发现快速排序在大多数情况下都比其他三种简单排序算法有更高的效率。
冒泡排序、选择排序和插入排序在最坏情况下的时间复杂度都较高,适合处理小规模数据集或者基本有序的数据。
一、实验目的1. 理解并掌握常见的数组排序算法;2. 分析不同排序算法的优缺点,提高算法选择能力;3. 提高编程能力,熟练运用编程语言实现排序算法。
二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:Eclipse三、实验内容1. 选择合适的排序算法进行实验;2. 编写排序算法的代码,实现数组的排序;3. 对排序结果进行分析,验证排序算法的正确性;4. 比较不同排序算法的执行效率。
四、实验过程1. 选择排序算法本次实验选择了以下四种排序算法进行实验:(1)冒泡排序(Bubble Sort)(2)选择排序(Selection Sort)(3)插入排序(Insertion Sort)(4)快速排序(Quick Sort)2. 编写排序算法代码以下为四种排序算法的Java代码实现:(1)冒泡排序```javapublic class BubbleSort {public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}}```(2)选择排序```javapublic class SelectionSort {public static void selectionSort(int[] arr) { int n = arr.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}}}```(3)插入排序```javapublic class InsertionSort {public static void insertionSort(int[] arr) { int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}}```(4)快速排序```javapublic class QuickSort {public static void quickSort(int[] arr, int low, int high) { if (low < high) {int pivot = partition(arr, low, high);quickSort(arr, low, pivot - 1);quickSort(arr, pivot + 1, high);}}public static int partition(int[] arr, int low, int high) { int pivot = arr[high];int i = (low - 1);for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;}}```3. 对排序结果进行分析为了验证排序算法的正确性,我们分别对四个排序算法进行了测试。
数据结构 排序算法综合实验报告
姓 名: xx x x 班 级: 10电信1 学 号: xxx 指导老师: 胡圣荣 日期: 2012.12.15~2013.1.5
华南农业大学工程学院 精选文档
— 2 算法基本思想:
1、插入排序:每次将一个待排序的记录,按其关键字大小插入到前面已经排序好的序列中的适当位置,直到全部记录插入完毕为止。 (1)直接插入排序:在排序过程中,每次都讲无序区中第一条记录插入到有序区中适当位置,使其仍保持有序。初始时,取第一条记录为有序区,其他记录为无序区。显然,随着排序过程的进行,有序区不断扩大,无序区不断缩小。最终无序区变为空,有序区中包含了所有的记录,排序结束。 (2)希尔排序:将排序表分成若干组,所有相隔为某个“增量”的记录为一组,在各组内进行直接插入排序;初始时增量d1较大,分组较多(每组的记录数少),以后增量逐渐减少,分组减少(每组的记录数增多),直到最后增量为1(d1>d2>...>dt=1),所有记录放为一组,再整体进行一次直接插入排序。
2、交换排序:每次比较两个待排序的记录,如果发现他们关键字的次序与排序要求相反时就交换两者的位置,直到没有反序的记录为止。 (1)冒泡排序:设想排序表R[1]到R[n]垂直放置,将每个记录R[i]看作是重量为R[i].key的气泡;根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡违反本原则的轻气泡,就使其向上“漂浮”,如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。 (2)快速排序:在待排序的n个记录中任取一个作为“基准”,将其与记录分为两组,第一组中个记录的键值均小于或等于基准的键值,第二组中个记录的键值均大于或等于基准的键值,而基准就排在这两组中间(这也是该记录的最终位置),这称为一趟快速排序(或一次划分)。对所分成的两组重复上述方法,直到所有记录都排在适当位置为止。
3、选择排序:每次从待排序的记录中选出关键字最小(或最大)的记录,顺序放在已排好序的子序列的后面(或最前),直到全部记录排序完毕。 (1)直接选择排序:首先,所有记录组成初始无序区R[1]到R[n],从中选出键值最小的记录,与无序区第一个记录R[1]交换;新的无序区为R[2]到R[n],从中再选出键值最小的记录,与无序区第一个记录R[2]交换;类似,第i趟排序时R[1]到R[i-1]是有序区,无序区为R[i]到R[n],从中选出键值最小的记录,将它与无序区第一个记录R[i]交换,R[1]到R[i]变为新的有序区。因为每趟排序都使有序区中增加一个记录,所以,进行n-1趟排序后,整个排序表就全部有序了。 (2)堆排序:利用小根堆(或大根堆)来选取当前无序区中关键字最小(或最大)的记录来实现排序的。下面介绍利用大根堆来排序。首先,将初始无序区调整为一个大根堆,输出关键字最大的堆顶记录后,将剩下的n-1个记录在重建为堆,于是便得到次小值。如此反复执行,知道全部元素输出完,从而得到一个有序序列。
4、并归排序:指将若干个已排序的子表合成一个有序表。 (1)二路并归排序:开始时,将排序表R[1]到R[n]看成n个长度为1的有序子表,把这些子表两两并归,便得到n/2个有序的子表(当n为奇数时,并归后仍是有一个长度为1的子表);然后,再把这n/2个有序的子表两两并归,如此反复,直到最后得到一个程度为n的有序表为止。 精选文档 — 3 各种排序实验结果:
CPU (英特尔)Intel(R) Core(TM) i5 CPU M 480 @ 2.67GHz 姓名 xx 内存 4.00 GB (金士顿 PC3-10600 DDR3 1333MHz) 学号 xxxxxxxxxx 主板 宏碁 JE40_CP 班级 10电信1班 操作系统 Microsoft Windows 7 旗舰版 (64位/Service Pack 1) 电话 xxxxxxxxxxxxx 编译软件 Visual C++ 6.0 email 609803959@qq.com 10^4 2*10^4 10^5 2*10^5 10^6 2*10^6 10^7 2*10^7 10^8 10^5 正序 逆序 直接插入 (带监视哨) C 24.874 100.158 2500.3 9995.6 0.099999 5000.05 t(时间) 0.156 0.546 13.391 53.417 >5min 0 27.486 直接插入 (无监视哨) C 24.874 100.158 2500.3 9995.6 0.099999 4999.95 t 0.156 0.578 14.21 56.715 >5min 0 29.137 希尔排序 (无监视哨) C 0.261664 0.598651 4.29106 9.60946 70.5165 166.929 1084.56 2461.37 17159.6 1.50001 2.24458
t 0.015 0.016 0.047 0.109 0.717 1.591 11.544 27.735 208.722 0.02 0.02
直接选择 C 0 0 0 0 0 0 t 0.218 0.78 19.367 77.32 >5min 19.751 20.249 冒泡(上升) C 49.9905 199.985 4999.94 19999.9 0.099999 4999.95 t 0.452 1.825 45.542 182.678 >5min 0 47.326
冒泡(下沉) C 49.9904 199.96 4999.78 19999.9 0.099999 4999.95 t 0.483 1.902 47.239 189.081 >5min 0 47.503
快速(递归) C 0.170775 0.361618 2.17042 4.79646 25.8125 57.6668 320.86 647.454 3493.6 2201.3 2201.4 t 0.01 0.01 0.031 0.062 0.219 0.484 2.577 5.297 29.377 18.026 18.195 堆排序 (非递归) C 0.235479 0.510793 3.01938 6.43895 36.7932 77.5876 434.639 909.281 5012.88 3.11252 2.92664
t 0.016 0.016 0.047 0.094 0.499 0.968 7.223 17.093 123.429 0.04 0.05 堆排序 (递归) C 0.235479 0.510793 3.01938 6.43895 36.7932 77.5876 434.639 909.281 5012.88 3.11252 2.92664
t 0 0.015 0.078 0.125 0.903 1.825 13.659 31.742 235.346 0.06 0.07 二路归并 (非递归) C 0.123676 0.267361 1.56651 3.33305 18.7166 39.4319 224.002 468.006 2540.15 0.877986 0.815024
t 0 0.015 0.046 0.062 0.25 0.546 3.017 6.457 35.309 0.03 0.03 精选文档
— 4 实验结果原因分析和结论: 1. 插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。反而在这种情况下,快速排序反而慢了。 当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。 若待排序的记录的关键字在一个明显有限范围内时,且空间允许是用桶排序。 当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。 当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下。宜用归并排序。 当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。
2.插入排序、冒泡排序、选择排序的时间复杂性为O(n2) 其它非线形排序的时间复杂性为O(nlog2n) 线形排序的时间复杂性为O(n);
3.在算法运行期间,运行QQ软件、360安全卫士、360杀毒、word文档、ppt、酷狗等软件会影响绝对时间和逻辑时间,使时间增大
4.随着n的取值增大,算法的实际时间增长速度逐渐增大。 5.直接插入排序(有、无监视哨)、冒泡排序(上升、下沉)、堆排序(递归、非递归)的关键字比较次数相同,但绝对时间相差比较大;直接选择排序与冒泡排序的关键字比较次数相近。
6.相比较其他同学的数据,直接插入(有、无监视哨),直接选择,冒泡(上升、下沉)的结果相差较小,希尔选择结果相差很大,另快速(递归),堆(递归,非递归),二路归并(非递归)结果并不会受计算机环境而不同。 精选文档
— 5 附录:源程序极其代码 #define CPP C++ #define MPP M++ #define MP2 M+=2 #define MP3 M+=3
#include #include #include #include #include
const int maxsize=20000; //排序表容量 typedef int datatype; typedef struct { datatype key; //关键字域 // othertype other; //其它域 } rectype; //记录类型 typedef rectype list[maxsize+2]; //排序表类型,0号单元不用
__int64 C,M; //比较和移动次数 void check(list R,int n) { //检验排序结果 int i; for(i=2;i<=n;i++) if(R[i].keycout<<"Correct! "; }
void disp(list R,int n) { //显示排序后的结果 int i; for(i=1;i<=n;i++) { cout/ if(i%20==0) cout<} cout<}
void InsertSort1(list R,int n) {//直接插入排序,带监视哨(并不改变关键字次数) int i,j; for(i=2;i<=n;i++) { //依次插入R[2],R[3],…,R[n]