推荐下载快速排序算法实验报告word范文模板 17页文档格式.docx
《推荐下载快速排序算法实验报告word范文模板 17页文档格式.docx》由会员分享,可在线阅读,更多相关《推荐下载快速排序算法实验报告word范文模板 17页文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
输出:
输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。
按此顺序进行,则使得所有任务等待时间最小。
4.测试数据:
输入
9
534261573输出
123345567
三、概要设计
抽象数据类型
因为此题不需要存储复杂的信息,故只需一个整型数组就可以了。
算法的基本思想
对一个给定的进行快速排序,首先需要选择一个轴值,假设输入的数组中有k个小于轴值的数,于是这些数被放在数组最左边的k个位置上,而大于周知的结点被放在数组右边的n-k个位置上。
k也是轴值的下标。
这样k把数组分成了两个子数组。
分别对两个子数组,进行类似的操作,便能得到正确的排序结果。
程序的流程
输入事件件数n-->
随机产生做完没个事件
所需时间-->
对n个时间进行排序-->
输出结果
快速排序方法(因图难画,举一个实例):
初始状态72657888542lr第一趟循环72657888542lr第一次交换67257888542lr第二趟循环67257888542rl第二次交换72657888542rl
反转交换67257888542rl
这就是依靠轴值,将数组分成两部分的实例(特殊情况下,可能为一部分,其中42是轴值)。
对分成的两部分数组,分别尽心类似的操作,便可得符合要求的结果。
快速排序的函数模块;
voidqsort(int*array,intl,intr){
if(r<
=l)return;
intpivotIndex=l+rand()%(r-l+1);
//随机选定轴值
swap1(array,pivotIndex,r);
//将选定的轴值放到每段数组的最后intk=partition(array,l-1,r,array[r]);
//依靠轴值,将数组分//成两部分
swap1(array,k,r);
//将轴值放到正确的位置上
qsort(array,l,k-1);
//递归调用,对数组左右两部分进行排序qsort(array,k+1,r);
}
/*将大于轴值的放右边,小于轴值的放左边算法实现*/intpartition(int*array,intl,intr,constintpivot){
do{
while(array[++l]<
pivot);
while((r!
=0)&
&
(array[--r]>
pivot));
swap1(array,l,r);
}while(l<
r);
}
swap1(array,l,r);
returnl;
算法的时空分析
快速排序在最差情况下,时间代价为Θ(n2),但很少出现这种情况。
如果快速排序找到了完美的轴值,那么整个算法的时间代价为Θ(n㏒n)。
输入和输出的格式
输入
n=//提示等待输入输出
原始序列:
//提示随机产生的n个随机数结果:
//提示正确的排序结果
四、测试结果
五、实验心得(可选)
这个实验,不难。
但是关键在于理解快速排序的那个过程,如何根据轴值将数组分成两部分,然后将轴值放到合适的位置,继续对分成两部分的数组,执行类似的操作。
六、附录(实验源码)
#include<
iostream>
#include<
ctime>
usingnamespacestd;
//产生n个随机数,存储到数组int*crtArray(int&
size){intn;
cout<
<
"
n="
;
cin>
>
n;
//设置随机种子
srand(time(NULL));
int*intArray=newint[n];
size=n;
cout<
"
<
endl;
for(inti=0;
i<
n;
i++){
intArray[i]=rand()%10;
if(intArray[i]==0){i--;
continue;
}cout<
intArray[i]<
returnintArray;
//交换数组中的两个值
voidswap1(int*array,int&
a,int&
b){inttemp=array[a];
array[a]=array[b];
array[b]=temp;
//对指定的数组部分进行分割
intpartition(int*array,intl,intr,constintpivot){do{while(array[++l]<
=pivot));
}while(l<
//快速排序的实现部分
voidqsort(int*array,intl,intr){if(r<
intpivotIndex=r;
intk=partition(array,l-1,r,array[r]);
swap1(array,k,r);
qsort(array,l,k-1);
qsort(array,k+1,r);
/*主函数*/intmain(){intsize;
int*Array;
Array=crtArray(size);
qsort(Array,0,size-1);
结果:
size;
i++)cout<
Array[i]<
return0;
}
篇二:
数据结构实验八快速排序实验报告
数据结构实验课程最终报告
题目:
实验八快速排序
专业班级:
计算机科学与技术
姓名:
XXX
学号:
指导老师:
李晓鸿
完成日期:
201X.01.06
一、需求分析
背景
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。
假设含n个记录的序列为{R1,R2,?
,Rn}
其相应的关键字序列为{K1,K2,?
,Kn}
这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系:
Kp1≤Kp2≤?
≤Kpn
按此固有关系将上式记录序列重新排列为{Rp1,Rp2,?
,Rpn}的操作称作排序。
排序算法是计算机科学中最重要的研究问题之一。
对于排序的研究既有理论上的重要意义,又有实际应用价值。
它在计算机图形、计算机辅助设计、机器人、模式识别、及统计学等领域具有广泛应用。
常见的排序算法有起泡排序、直接插入排序、简单选择排序、快速排序、堆排序等。
例1:
有时候应用程序本身就需要对信息进行排序。
为了准备客户账目,银行需要根据支票的号码对支票排序;
例2:
在一个绘制互相重叠的图形对象的程序中,可能需要根据一个“在上方”关系将各对象排序,以便自下而上地绘出对象。
例3:
在一个由n个数构成的集合上,求集合中第i小/大的数。
例4:
对一个含有n个元数的集合,求解中位数、k分位数。
1.问题描述
2.程序要求实现的功能
当有n件任务同时来临时,每件任务需要用时ni,求出让所有任务等待的时间和最小的任务处理顺序。
3.输入输出要求
a)输入要求:
b)输出要求:
4.测试数据
1.输入:
请输入任务件数:
-1
输出:
输入有误,请重新输入!
2.输入:
4
请输入各任务所需时间:
2430
3.输入:
2436
任务执行的先后顺序为:
2
3
6
4.输入:
534261573
1
5
7
二、概要设计
(一)函数调用关系图
int
intPartition(int
start,intrandom(intstart,intend);
voidchange(int
a[],inti,intj);
a[],int主
函数voidQuickSort(inta[],intend);
start,intend);
void
QuickSort(inta[],intstart,int
end);
三、详细设计
(一)物理数据类型
本程序所输入的任务件数和任务时间均为整数,可使用整数int实现数据的存储。
使用数组实现快速排序。
(二)具体步骤和伪代码
1.输入任务件数及任务时长
while
(1)
{
cout<
请输入任务件数:
cin>
while(size)//任务件数大于0,则执行该循环,否则重新输入件数{
inti;
请输入各任务所需时间:
for(i=0;
i++)
a[i];
if(a[i]<
=0)
endl;
break;
if(i==size)
2.调用函数取随机轴值
intrandom(intstart,intend)