快速排序实验报告

合集下载

快速排序实验报告

快速排序实验报告

快速排序实验报告

快速排序实验报告

引言

快速排序是一种常用的排序算法,其核心思想是通过分治的方法将一个大问题拆分成多个小问题进行解决。本实验旨在通过实际操作和观察,验证快速排序算法的效率和可靠性。

实验步骤

1. 实验准备

在开始实验之前,我们需要准备一些必要的工具和材料。首先,我们需要一台计算机,并安装好支持编程语言的开发环境。其次,我们需要编写一个快速排序的程序,以便后续的实验操作。

2. 实验设计

为了验证快速排序算法的效率和可靠性,我们设计了以下实验方案:

(1)生成随机数序列:我们使用随机数生成器生成一组随机数序列,作为待排序的数据。

(2)执行快速排序算法:我们将生成的随机数序列作为输入,调用快速排序算法对其进行排序。

(3)记录排序时间:我们记录下排序算法执行的时间,以评估其效率。

(4)验证排序结果:我们对排序后的结果进行验证,确保排序算法的可靠性。

3. 实验过程

我们按照上述设计方案,进行了以下实验操作:

(1)生成随机数序列:我们使用编程语言的随机数生成函数,生成了一组包含

1000个随机数的序列。

(2)执行快速排序算法:我们调用了编写好的快速排序程序,对生成的随机数序列进行排序。

(3)记录排序时间:我们使用计算机的计时功能,记录下排序算法执行的时间为0.032秒。

(4)验证排序结果:我们对排序后的结果进行了验证,确保排序算法的正确性。通过比较排序前后的序列,我们确认排序算法的可靠性。

实验结果

通过实验,我们得到了以下结果:

(1)排序算法的效率:根据实验记录,快速排序算法对1000个随机数进行排

快速排序的实验报告

快速排序的实验报告

快速排序的实验报告

《快速排序实验报告》

摘要:

本实验旨在通过实际操作快速排序算法,对其性能进行评估和分析。通过对不同规模数据集的排序实验,我们对快速排序算法的时间复杂度和空间复杂度进行了详细的分析,并对比了不同数据规模下快速排序算法的排序效率。实验结果表明,快速排序算法在大多数情况下具有较高的排序效率和稳定的性能。引言:

快速排序是一种常用的排序算法,其时间复杂度为O(nlogn),在实际应用中具有较高的效率和性能。本实验通过对快速排序算法的实际操作和性能评估,旨在深入了解快速排序算法的内部原理和实际应用效果,为进一步研究和应用排序算法提供参考。

实验方法:

1. 实验环境:使用C++语言编写快速排序算法,运行环境为Windows操作系统,CPU为Intel Core i5,内存为8GB。

2. 实验数据:选取不同规模的随机数据集进行排序实验,包括1000个数据、10000个数据和100000个数据。

3. 实验步骤:分别对不同规模的数据集进行快速排序算法的排序操作,并记录排序所需的时间和空间复杂度。

实验结果:

1. 时间复杂度:通过实验数据统计,不同规模数据集下,快速排序算法的平均时间复杂度分别为O(nlogn)、O(nlogn)和O(nlogn),验证了快速排序算法的时

间复杂度为O(nlogn)。

2. 空间复杂度:实验结果表明,快速排序算法的空间复杂度为O(logn),在不同规模数据集下,所需的额外空间较小。

3. 排序效率:对比实验结果显示,快速排序算法在不同规模数据集下具有较高

的排序效率,排序时间随数据规模的增加而略微增加,但仍保持较高的效率。

快速排序实验报告

快速排序实验报告

《程序设计实践》报告

学号江元;

姓名 090241111 ;

题目序号 2011年题目:排序7.1B类的第5题;

难度等级 B

一、题目

写出快速排序的非递归算法

二、问题分析及求解基本思路

问题分析:

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。而在程序设计中虽然应用递归技术, 能够使得程序简洁易懂, 但是效率并不是最高的,因此可以利用栈结构实现非递归的快速排序。

求解基本思路:

将每次分治的两个序列的高位和低位入栈,每次都从栈中获取一对高位和低位,分别处理。处理过程是:选取高位作为基准位置,从低位开始向高位遍历,如果比基准元素小,那么和第i个交换,如果有交换,那么i++,等一遍遍历完成后,如果i 的位置不等于基准位置,那么所选的基准位置的值不是最大的而这时候i的位置之前的元素都比基准值小,那么i的位置应该是基准值,将i所在位置的值和基准位置进行交换。这时候,在i的左右就将序列分成两部分了,一部分比i所在位置值小,一部分比i所在位置值大的,然后再次将前面一部分和后面一部分的高位和低位分别入栈,再次选择基准位置,直到所选择的区间大小小于2,就可以不用入栈了。

三、问题求解的整体框架结构

四、主要算法

1.非递归快速排序算法qsrt( a, l , r ):

由partition(pData, low, high)返回了轴值,st.push(low); st.push(pivot - 1); st.push(pivot + 1); st.push(high);

快速排序实验报告

快速排序实验报告

快速排序实验报告

实验目的:

通过实现快速排序算法,掌握分治思想及其在排序算法中的应用;并比较快速排序和

插入排序的性能。

实验内容:

1. 实现快速排序算法。

2. 设计实验,比较快速排序和插入排序的性能差异。

实验方法:

本实验使用C++语言编写程序,在Visual Studio 2019开发环境中进行。

快速排序算法的基本思想是通过让一个元素进行递归地归为有序的序列来对数据进行

排序的。我们先选出一个基准值(通常是序列中的第一个元素)来作为枢轴,通过交换位

置将小于基准值的元素移动到其左侧,将大于基准值的元素移动到其右侧,然后递归地排

序左右两个子序列。

```cpp

void quickSort(int arr[], int low, int high) {

if (low < high) {

int pivotPos = partition(arr, low, high);

quickSort(arr, low, pivotPos - 1);

quickSort(arr, pivotPos + 1, high);

}

}

为了比较快速排序和插入排序的性能差异,我们需要对两种算法进行时间复杂度分析,并在同一数据集上分别测试两种算法的运行时间。

快速排序的时间复杂度为O(nlogn),其中n为数据集大小。而插入排序的时间复杂度为O(n²)。

为了进行性能测试,我们选择随机生成10万个整数作为测试数据。首先,我们使用快速排序进行排序并记录时间,然后使用插入排序进行排序并记录时间,最后比较两种算法

的运行时间。

实验结果:

3-快速排序-实验报告

3-快速排序-实验报告
{
p->r[j+dk]=p->r[j];/*记录后移*/
}
p->r[j+dk]=p->r[0];/*插入到正确位置*/
}
}
}
void ShellSort(S_TBL *p,int dlta[],int t)
{
/*按增量序列dlta[0,1…,t-1]对顺序表*p作希尔排序*/
for(int k=0;k<t;k++)
/*顺序存储结构*/
typedef struct{
ElemType *r;/*数组基址*/
int length;/*表长度*/
}S_TBL;
void CreateTestData(S_TBL * tbl)
{
tbl->r=r;
tbl->r[0].key=0;//辅助单元,默认存放0
tbl->r[1].key=503;
3、代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1000
typedef int KeyType;
typedef struct{
KeyType key;/*关键码字段,可以是整型、字符串型、构造类型等*/
}ElemType;

排序的实验报告

排序的实验报告

排序的实验报告

排序的实验报告

引言:

排序是计算机科学中非常重要的一个概念,它涉及到对一组数据按照一定规则进行重新排列的操作。在计算机算法中,排序算法的效率直接影响到程序的运行速度和资源利用率。为了深入了解各种排序算法的原理和性能,我们进行了一系列的排序实验。

实验一:冒泡排序

冒泡排序是最简单的排序算法之一。它的原理是通过相邻元素的比较和交换来实现排序。我们编写了一个冒泡排序的算法,并使用Python语言进行实现。实验中,我们分别对10、100、1000个随机生成的整数进行排序,并记录了排序所需的时间。

实验结果显示,随着数据规模的增加,冒泡排序的时间复杂度呈现出明显的增长趋势。当数据规模为10时,排序所需的时间约为0.001秒;而当数据规模增加到1000时,排序所需的时间则增加到了1.5秒左右。这说明冒泡排序的效率较低,对大规模数据的排序并不适用。

实验二:快速排序

快速排序是一种常用的排序算法,它的核心思想是通过分治的策略将数据分成较小的子集,然后递归地对子集进行排序。我们同样使用Python语言实现了快速排序算法,并对相同规模的数据进行了排序实验。

实验结果显示,快速排序的时间复杂度相对较低。当数据规模为10时,排序所需的时间约为0.0005秒;而当数据规模增加到1000时,排序所需的时间仅为

0.02秒左右。这说明快速排序适用于大规模数据的排序,其效率较高。

实验三:归并排序

归并排序是一种稳定的排序算法,它的原理是将待排序的数据分成若干个子序列,然后将子序列两两合并,直到最终得到有序的结果。我们同样使用Python 语言实现了归并排序算法,并进行了相同规模数据的排序实验。

快速排序实验报告

快速排序实验报告

快速排序实验报告

一、目的和要求

1、掌握快速排序的实现方法

2、掌握快速排序的基本思想

3、掌握快速排序的时间性能

4、要求:用快速排序法实现对无序序列的排序

二、程序设计的基本思想,原理和算法描述

快速排序是对起泡排序的一种改进,它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对两部分记录继续进行排序,以达到整个序列有序。

快速排序的三个步骤:

1、选择基准:在待排序列中,按照某种方式挑出一个元素,作为基准

2、分割操作:以该基准在序列中实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大

3、递归地对两个序列快速排序,直到序列为空或者只有一个元素。

三、心得与体会

这个实验关键在于理解快速排序的那个过程,如何根据轴值将数

组分成两部分,然后将轴值放到合适的位置,继续对分成两部分的数组,执行类似的操作。通过这次实验,理解和体会了快速排序的基本思想,了解到在所有同数量级的排序方法中,快速排序的平均性能最好。

快速排序算法实验报告

快速排序算法实验报告

快速排序算法实验报告

快速排序算法实验报告

引言

快速排序算法是一种高效的排序算法,它的时间复杂度为O(nlogn),在实际应

用中被广泛使用。本实验旨在通过实际的实验数据,验证快速排序算法的效果

和性能,并对其进行分析和总结。

实验设计

本实验采用C++语言编写快速排序算法,并通过随机生成的数据进行排序实验。实验中使用了不同规模的数据集,并记录了排序所需的时间和比较次数。

实验步骤

1. 实现快速排序算法

快速排序算法的核心思想是通过选取一个基准元素,将待排序的序列分为两

部分,一部分比基准元素小,一部分比基准元素大,然后对这两部分继续进行

快速排序。具体实现时,可以选择序列的第一个元素作为基准元素,然后使用

分治法递归地对子序列进行排序。

2. 生成测试数据

为了验证快速排序算法的性能,我们生成了不同规模的随机数序列作为测试

数据。测试数据的规模分别为1000、10000、100000和1000000。

3. 进行排序实验

使用生成的测试数据,对快速排序算法进行实验。记录每次排序所需的时间

和比较次数,并将结果进行统计和分析。

实验结果

通过对不同规模的数据集进行排序实验,我们得到了以下结果:

数据规模排序时间(ms)比较次数

1000 2 8728

10000 12 114846

100000 124 1356477

1000000 1483 15737267

分析与讨论

从实验结果可以看出,随着数据规模的增大,排序所需的时间和比较次数也呈指数级增长。这符合快速排序算法的时间复杂度为O(nlogn)的特性。

另外,通过观察实验结果,我们可以发现快速排序算法的性能受到多个因素的影响。首先,基准元素的选择对算法的效率有很大的影响。如果选择的基准元素恰好是序列的中位数,那么排序的效率会更高。其次,数据的初始顺序也会影响排序的效果。如果数据已经是有序的,那么快速排序算法的效率将大大降低。

快速排序实验总结

快速排序实验总结

快速排序实验总结

快速排序是一种常用的排序算法,其基本思想是通过分治的方法将待排序的序列分成两部分,其中一部分的所有元素均小于另一部分的元素,然后对这两部分分别进行递归排序,直到整个序列有序。下面是我在实验中对于快速排序算法的一些总结和思考。

一、算法步骤

快速排序的基本步骤如下:

1.选择一个基准元素(pivot),将序列分成两部分,一部分的所有元素均小

于基准元素,另一部分的所有元素均大于等于基准元素。

2.对于小于基准元素的部分和大于等于基准元素的部分,分别递归地进行快速

排序,直到两部分都有序。

3.合并两部分,得到完整的排序序列。

二、算法优缺点

优点:

1.快速排序的平均时间复杂度为O(nlogn),在排序大数据集时表现优秀。

2.快速排序是一种原地排序算法,不需要额外的空间,因此空间复杂度为

O(logn)。

3.快速排序具有较好的可读性和可维护性,易于实现和理解。

缺点:

1.快速排序在最坏情况下的时间复杂度为O(n^2),此时需要选择一个不好的

基准元素,例如重复元素较多的序列。

2.快速排序在处理重复元素较多的序列时,会出现不平衡的分割,导致性能下

降。

3.快速排序在递归过程中需要保存大量的递归栈,可能导致栈溢出问题。

三、算法实现细节

在实现快速排序时,以下是一些需要注意的细节:

1.选择基准元素的方法:通常采用随机选择基准元素的方法,可以避免最坏情

况的出现。另外,也可以选择第一个元素、最后一个元素、中间元素等作为基准元素。

2.分割方法:可以采用多种方法进行分割,例如通过双指针法、快速选择算法

等。其中双指针法是一种常用的方法,通过两个指针分别从序列的两端开始扫描,交换元素直到两个指针相遇。

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

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

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

一、实验目的

1.掌握快速排序算法的原理。

2. 掌握在不同情况下快速排序的时间复杂度。

二、实验原理

快速排序是一种基于交换的排序方式。它是由图灵奖得主 Tony Hoare 发明的。快速

排序的原理是:对一个未排序的数组,先找一个轴点,将比轴点小的数放到它的左边,比

轴点大的数放到它的右边,再对左右两部分递归地进行快速排序,完成整个数组的排序。

优缺点:

快速排序是一种分治思想的算法,因此,在分治思想比较适合的场景中,它具有较高

的效率。它是一个“不稳定”的排序算法,它的工作原理是在大数组中选取一个基准值,

然后将数组分成两部分。具体过程如下:

首先,选择一个基准值(pivot),一般是选取数组的中间位置。然后把数组的所有值,按照大小关系,分成两部分,小于基准值的放左边,大于等于基准值的放右边。

继续对左右两个数组递归进行上述步骤,直到数组只剩一个元素为止。

三、实验步骤

1.编写快速排序代码:

void quicksort(int *a,int left,int right) {

int i,j,t,temp;

if(left>right)

return;

temp=a[left];

i=left;

j=right;

while(i!=j) {

// 顺序要先从右往左移

while(a[j]>=temp&&i

j--;

while(a[i]<=temp&&i

i++;

if(i

t=a[i];

a[i]=a[j];

a[j]=t;

}

}

a[left]=a[i];

a[i]=temp;

quicksort(a,left,i-1);

快速排列实验报告

快速排列实验报告
pivotkey=q[low];
while(low<high)//判断长度是否大于1
{
while(low<high && q[high]>=pivotkey)
high--;
q[low]=q[high];//当pivotkey的值大于q[high],将q[high]放入q[low]中,q[high]空出
pivotkey=q[low];
while(low<high)//判断长度是否大于1
{
while(low<high && q[high]>=pivotkey)
high--;
q[low]=q[high];//当pivotkey的值大于q[high],将q[high]放入q[low]中,q[high]空出
cin>>n;
cout<<"\n请输入需要排序的数:\n";
for(int i=1;i<=n;i++)//用循环方式输入数列
{
cin>>q[i];
}
Qsort(q,1,n);//调用Partition()函数
cout<<"\n排序后结果为:\n";
for(i=1;i<=n;i++)//循环输出结果

快速排序报告

快速排序报告

《数据结构课程设计》报告

题目:快速排序问题

专业 计算机科学与技术

学生姓名 高海松 班级 B 计116 学

1110704605 指导教师 巩永旺 完成日期

2013年1月11日

目录

1简介 (3)

2算法说明 (5)

3测试结果 (6)

4分析与探讨 (8)

5小结 (11)

附录:源程序清单 (11)

一、简介

1、排序及排序算法类型

排序是数据处理领域和软件设计领域中一种常见而重要的运算。排序就是将一组记录(元素)的任意序列按照某个域的值的递增(从小到大)或递减(由大到小)的次序重新排列的过程。排序的目的之一就是为了方便查找。排序分为内部排序和外部排序。在内存中进行的排序叫内部排序,利用外部存储的排序叫外部排序。

内部排序的方法有很多,但就其全面性能而言,很难提出一种被认为是最好的方法,每一种方法都有各自的缺点,适合在不同的环境下使用。按照其策略不同,可归纳为五类:插入排序、交换排序、选择排序、归并排序和基数排序。

2、快速排序算法介绍

快速算法就像是它的名称所暗示的,是一种快速的分而治之的算法,平均时间复杂度为O(nlog2n)。它的速度主要归于一个非常紧凑并且高度优化的内部循环。其基本算法Quicksort(S)由以下4个步骤组成:

(1)如果S中的元素的个数为0或1 ,则返回。

(2)选择S中的任意一个元素v,v叫做支点(Pivot).

(3)将S—{v}(剩下的元素在S中)分成两个分开的部分。L={x∈S—{v}|x ≦v}和R={x∈S-{v}|x≧v}。

(4)依次返回Quicksort(L)、v和Quicksort(R)的结果。

快速排序算法实验报告

快速排序算法实验报告

快速排序算法实验报告

快速排序算法实验报告

引言:

快速排序算法是一种常用且高效的排序算法,它的核心思想是通过分治的思想将一个大问题分解成多个小问题,并通过递归的方式解决这些小问题。本实验旨在通过实际实现和测试快速排序算法,探究其性能和效果。

实验目的:

1. 理解快速排序算法的原理和思想;

2. 掌握快速排序算法的实现方法;

3. 通过实验比较快速排序算法与其他排序算法的性能差异。

实验步骤:

1. 算法实现

首先,我们需要实现快速排序算法。快速排序算法的基本步骤如下:

- 选择一个基准元素(通常选择数组的第一个元素);

- 将数组分成两个子数组,小于基准元素的放在左边,大于基准元素的放在右边;

- 对左右子数组分别递归地应用快速排序算法;

- 合并左右子数组和基准元素。

代码实现如下:

```python

def quick_sort(arr):

if len(arr) <= 1:

return arr

pivot = 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个随机整数,并分别使用快速排序算法、插入排序算法和归并排序算法进行排序。记录下每个算法的运行时间。

快速排序算法实验报告

快速排序算法实验报告

快速排序算法实验报告

《快速排序算法实验报告》

摘要:本实验通过对快速排序算法的理论分析和实际测试,验证了快速排序算法在处理大规模数据时的高效性和稳定性。实验结果表明,快速排序算法在平均情况下具有较高的时间复杂度和空间复杂度,能够在短时间内对大规模数据进行快速排序,适用于各种实际应用场景。

1. 算法简介

快速排序算法是一种基于分治思想的排序算法,通过不断地将数据分割成较小的子集,然后分别对子集进行排序,最终将所有子集合并成有序序列。其基本思想是选择一个基准元素,将小于基准的元素放在基准的左边,大于基准的元素放在基准的右边,然后递归地对左右两部分进行排序,直到整个序列有序。

2. 实验设计

为了验证快速排序算法的效率和稳定性,我们设计了以下实验步骤:

(1)编写快速排序算法的实现代码;

(2)使用不同规模的随机数据进行排序,并记录排序所需的时间;

(3)对比快速排序算法与其他排序算法的效率和稳定性。

3. 实验结果

我们使用C++语言编写了快速排序算法的实现代码,并对不同规模的随机数据进行了排序实验。实验结果显示,快速排序算法在处理大规模数据时表现出了较高的效率和稳定性,排序时间与数据规模呈线性关系,且远远快于其他排序算法。此外,快速排序算法在最坏情况下的时间复杂度为O(n^2),但在平均情况下的时间复杂度为O(nlogn),具有较好的性能表现。

4. 结论

通过实验验证,我们得出了以下结论:

(1)快速排序算法在处理大规模数据时具有较高的效率和稳定性;

(2)快速排序算法在平均情况下具有较高的时间复杂度和空间复杂度,适用于各种实际应用场景;

【精编范文】快速排序算法实验报告-范文word版 (17页)

【精编范文】快速排序算法实验报告-范文word版 (17页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!

== 本文为word格式,下载后可方便编辑和修改! ==

快速排序算法实验报告

篇一:快速排序( 实验报告附C++源码)

快速排序

一、问题描述

在操作系统中,我们总是希望以最短的时间处理完所有的任务。但事情总是要一件件地做,任务也要操作系统一件件地处理。当操作系统处理一件任务时,其他待处理的任务就需要等待。虽然所有任务的处理时间不能降低,但我们可以安排它们的处理顺序,将耗时少的任务先处理,耗时多的任务后处理,这样就可以使所有任务等待的时间和最小。

只需要将n 件任务按用时去从小到大排序,就可以得到任务依次的处理顺序。当有 n 件任务同时来临时,每件任务需要用时ni,求让所有任务等待的时间和最小的任务处理顺序。

二、需求分析

1. 输入事件件数n,分别随机产生做完n件事所需要的时间;

2. 对n件事所需的时间使用快速排序法,进行排序输出。排序时,要求轴

值随机产生。 3. 输入输出格式:

输入:

第一行是一个整数n,代表任务的件数。

接下来一行,有n个正整数,代表每件任务所用的时间。输出:

输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。按此顺序进行,则使得所有任务等待时间最小。 4. 测试数据:输入

9

5 3 4 2

6 1 5

7 3 输出

1 2 3 3 4 5 5 6 7

三、概要设计

抽象数据类型

因为此题不需要存储复杂的信息,故只需一个整型数组就可以了。

算法的基本思想

对一个给定的进行快速排序,首先需要选择一个轴值,假设输入的数组中有k 个小于轴值的数,于是这些数被放在数组最左边的k个位置上,而大于周知的结点被放在数组右边的n-k个位置上。k也是轴值的下标。这样k把数组分成了两个子数组。分别对两个子数组,进行类似的操作,便能得到正确的排序结果。

【精编范文】快速排序算法实验报告-范文word版 (17页)

【精编范文】快速排序算法实验报告-范文word版 (17页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!

== 本文为word格式,下载后可方便编辑和修改! ==

快速排序算法实验报告

篇一:快速排序( 实验报告附C++源码)

快速排序

一、问题描述

在操作系统中,我们总是希望以最短的时间处理完所有的任务。但事情总是要一件件地做,任务也要操作系统一件件地处理。当操作系统处理一件任务时,其他待处理的任务就需要等待。虽然所有任务的处理时间不能降低,但我们可以安排它们的处理顺序,将耗时少的任务先处理,耗时多的任务后处理,这样就可以使所有任务等待的时间和最小。

只需要将n 件任务按用时去从小到大排序,就可以得到任务依次的处理顺序。当有 n 件任务同时来临时,每件任务需要用时ni,求让所有任务等待的时间和最小的任务处理顺序。

二、需求分析

1. 输入事件件数n,分别随机产生做完n件事所需要的时间;

2. 对n件事所需的时间使用快速排序法,进行排序输出。排序时,要求轴

值随机产生。 3. 输入输出格式:

输入:

第一行是一个整数n,代表任务的件数。

接下来一行,有n个正整数,代表每件任务所用的时间。输出:

输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。按此顺序进行,则使得所有任务等待时间最小。 4. 测试数据:输入

9

5 3 4 2

6 1 5

7 3 输出

1 2 3 3 4 5 5 6 7

三、概要设计

抽象数据类型

因为此题不需要存储复杂的信息,故只需一个整型数组就可以了。

算法的基本思想

对一个给定的进行快速排序,首先需要选择一个轴值,假设输入的数组中有k 个小于轴值的数,于是这些数被放在数组最左边的k个位置上,而大于周知的结点被放在数组右边的n-k个位置上。k也是轴值的下标。这样k把数组分成了两个子数组。分别对两个子数组,进行类似的操作,便能得到正确的排序结果。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

快速排序实验报告

《程序设计实践》报告

学号江元 ;

姓名 090241111 ;

题目序号 2011年题目:排序7.1B类的第5题 ;

难度等级 B

一、题目

写出快速排序的非递归算法

二、问题分析及求解基本思路

问题分析:

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。而在程序设计中虽然应用递归技术, 能够使得程序简洁易懂, 但是效率并不是最高的,因此可以利用栈结构实现非递归的快速排序。

求解基本思路:

将每次分治的两个序列的高位和低位入栈,每次都从栈中获取一对高位和低位,分别处理。处理过程是:选取高位作为基准位置,从低位开始向高位遍历,如果比基准元素小,那么和第i个交换,如果有交换,那么i++,等一遍遍历完成后,如果i的位置不等于基准位置,那么所选的基准位置的值不是最大的而这时候i的位置之前的元素都比基准值小,那么i的位置应该是基准值,将i所在位置的值和基准位置进行交换。这时候,在i的左右就将序列分成两部分了,一部分比i

所在位置值小,一部分比i所在位置值大的,然后再次将前面一部分和后面一部分的高位和低位分别入栈,再次选择基准位置,直到所选择的区间大小小于2,就可以不用入栈了。

三、问题求解的整体框架结构

输入要排序的元素开始的个数

依次输入要排序的

元素

借助定义的栈 Stack st

传入参数,调用非递

归实现的快速排序函调用函数partition 数qsort()

调用函数swap 非递归快速排序后输结束出排序后的元素顺序

四、主要算法

1(非递归快速排序算法qsrt( a, l , r ):

由partition(pData, low, high)返回了轴值,st.push(low); st.push(pivot - 1);

st.push(pivot + 1); st.push(high);

循环执行下列语句直到栈为空

(1)high = st.top(); st.pop(); low = st.top(); st.pop();

(2)若满足low < high,调用 partition(pData, low, high)返回轴值; 定义tmp = pivot -1

若low < tmp,st.push(low); st.push(tmp);

tmp = pivot + 1;

若tmp < high,st.push(tmp); st.push(high);

2(算法时间和空间复杂度:

时间复杂度:最坏情况下时间代价为T(n)=O(n*n),最好情况下时间代价为

O(nlogn),

平均时间代价也为O(nlogn)。

空间复杂度:由于引进一个栈,这个栈的大小取决于递归调用的深度,最多不会超过n,如果每次都选较大的部分进栈,处理较短的部分,递归深度最多不超过log2n,所以需要的附加存储开销为O(log2n)。

五、测试

六、总结

1. 调试过程中遇到的主要问题

(1)栈的定义以及初始化上出现了错误。

(2)开始并未实现动态存储,只是在程序代码中规定了要排序的代码。 (3)交换函数swap开始用额外变量时出错,后来不用额外变量,直接进行交换。

2. 经验和体会

(1) 快速排序算法的确很快,主要是因为它在数组进行分组时不是随便划分而是尽量将原数组划分为两半。轴值的选择也在某种程度上影响排序速度。

(2) 快速排序算法排序被评选为20世纪十大算法之一名副其实,不过还有许多可以改进和优化的地方。

相关文档
最新文档