参考文档快速排序算法实验报告推荐word版 17页.docx
《参考文档快速排序算法实验报告推荐word版 17页.docx》由会员分享,可在线阅读,更多相关《参考文档快速排序算法实验报告推荐word版 17页.docx(14页珍藏版)》请在冰豆网上搜索。
参考文档快速排序算法实验报告推荐word版17页
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!
==本文为word格式,下载后可方便编辑和修改!
==
快速排序算法实验报告
篇一:
快速排序(实验报告附C++源码)
快速排序
一、问题描述
在操作系统中,我们总是希望以最短的时间处理完所有的任务。
但事情总是要一件件地做,任务也要操作系统一件件地处理。
当操作系统处理一件任务时,其他待处理的任务就需要等待。
虽然所有任务的处理时间不能降低,但我们可以安排它们的处理顺序,将耗时少的任务先处理,耗时多的任务后处理,这样就可以使所有任务等待的时间和最小。
只需要将n件任务按用时去从小到大排序,就可以得到任务依次的处理顺序。
当有n件任务同时来临时,每件任务需要用时ni,求让所有任务等待的时间和最小的任务处理顺序。
二、需求分析
1.输入事件件数n,分别随机产生做完n件事所需要的时间;
2.对n件事所需的时间使用快速排序法,进行排序输出。
排序时,要求轴
值随机产生。
3.输入输出格式:
输入:
第一行是一个整数n,代表任务的件数。
接下来一行,有n个正整数,代表每件任务所用的时间。
输出:
输出有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]while((r!
=0)&&(array[--r]>pivot));swap1(array,l,r);
}while(l}
swap1(array,l,r);returnl;
算法的时空分析
快速排序在最差情况下,时间代价为Θ(n2),但很少出现这种情况。
如果快速排序找到了完美的轴值,那么整个算法的时间代价为Θ(n㏒n)。
输入和输出的格式
输入
n=//提示等待输入输出
原始序列:
//提示随机产生的n个随机数结果:
//提示正确的排序结果
四、测试结果
五、实验心得(可选)
这个实验,不难。
但是关键在于理解快速排序的那个过程,如何根据轴值将数组分成两部分,然后将轴值放到合适的位置,继续对分成两部分的数组,执行类似的操作。
六、附录(实验源码)
#include#includeusingnamespacestd;
//产生n个随机数,存储到数组int*crtArray(int&size){intn;cout<<"n=";
cin>>n;
//设置随机种子
srand(time(NULL));int*intArray=newint[n];size=n;
cout<<"原始序列:
"<intArray[i]=rand()%10;if(intArray[i]==0){i--;continue;}cout<cout<}
//交换数组中的两个值
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]=0)&&(array[--r]>=pivot));swap1(array,l,r);}while(l//快速排序的实现部分
voidqsort(int*array,intl,intr){if(r<=l)return;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);cout<<"结果:
"<篇二:
数据结构实验八快速排序实验报告
数据结构实验课程最终报告
题目:
实验八快速排序
专业班级:
计算机科学与技术
姓名:
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.问题描述
在操作系统中,我们总是希望以最短的时间处理完所有的任务。
但事情总是要一件件地做,任务也要操作系统一件件地处理。
当操作系统处理一件任务时,其他待处理的任务就需要等待。
虽然所有任务的处理时间不能降低,但我们可以安排它们的处理顺序,将耗时少的任务先处理,耗时多的任务后处理,这样就可以使所有任务等待的时间和最小。
只需要将n件任务按用时去从小到大排序,就可以得到任务依次的处理顺序。
当有n件任务同时来临时,每件任务需要用时ni,求让所有任务等待的时间和最小的任务处理顺序。
2.程序要求实现的功能
当有n件任务同时来临时,每件任务需要用时ni,求出让所有任务等待的时间和最小的任务处理顺序。
3.输入输出要求
a)输入要求:
第一行是一个整数n,代表任务的件数。
接下来一行,有n个正整数,代表每件任务所用的时间。
b)输出要求:
输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。
按此顺序进行,则使得所有任务等待时间最小。
4.测试数据
1.输入:
请输入任务件数:
-1
输出:
输入有误,请重新输入!
2.输入:
请输入任务件数:
4
请输入各任务所需时间:
2430
输出:
输入有误,请重新输入!
3.输入:
请输入任务件数:
4
请输入各任务所需时间:
2436
输出:
任务执行的先后顺序为:
2
3
4
6
4.输入:
请输入任务件数:
9
请输入各任务所需时间:
534261573
输出:
任务执行的先后顺序为:
1
2
3
3
4
5
5
6
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>>size;
while(size)//任务件数大于0,则执行该循环,否则重新输入件数{
inti;
cout<<"请输入各任务所需时间:
";
for(i=0;i{
cin>>a[i];
if(a[i]<=0)
{
cout<<"输入有误,请重新输入!
"<break;
}
}
if(i==size)
break;
}
cout<<"输入有误,请重新输入!
"<}
2.调用函数取随机轴值
intrandom(intstart,intend)
{
intt;
srand(time(NULL));//设置随机数种子,对多组数据排序时不会取相同的轴值while
(1)
{
t=rand()%(end+1);
if(t>=start)
returnt;
}
}
3.数组中的两个元素交换位置
voidchange(inta[N],inti,intj)
{
intt;
t=a[i];
a[i]=a[j];
a[j]=t;
}
4.快速排序时对数据进行划分区域
intPartition(inta[],intstart,intend)
{
inttemp=random(start,end);//得到随机轴值
change(a,temp,end);
inti=start-1;//i用来指示轴值之后插入的位置
intbase=a[end];//以最后一个数作为划分的基点
for(intj=start;j{
if(a[j]<=base)
{
i++;
change(a,i,j);
}
}
change(a,i+1,end);
returni+1;
}
5.快速排序
voidQuickSort(inta[N],intstart,intend)
{
if(end<=start)
return;//没有数据或只有一个数据
篇三:
实验报告_排序与查找
电子科技大学
实验报告
课程名称:
学生姓名:
学号:
点名序号:
指导教师:
实验地点:
实验时间:
201X-201X-2学期
信息与软件工程学院
实验报告
(二)
学生姓名学号:
指导教师:
实验地点:
基础实验大楼实验时间:
5月20日
一、实验室名称:
软件实验室
二、实验项目名称:
数据结构与算法—排序与查找
三、实验学时:
4
四、实验原理:
快速排序的基本思想是:
通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。
一躺快速排序的算法是:
1)设置两个变量I、J,排序开始的时候I:
=1,J:
=N
2)以第一个数组元素作为关键数据,赋值给X,即X:
=A[1];
3)从J开始向前搜索,即(J:
=J-1),找到第一个小于X的值,两者交换;
4)从I开始向后搜索,即(I:
=I+1),找到第一个大于X的值,两者交换;
5)重复第3、4步,直到I=J。
二分法查找(折半查找)的基本思想:
(1)确定该区间的中点位置:
mid=(low+high)/2
min代表区间中间的结点的位置,low代表区间最左结点位置,high代表区间最右结点位置
(2)将待查a值与结点mid的关键字(下面用R[mid].key)比较,若相等,则查找成功,否则确定新的查找区间:
A)如果R[mid].key>a,则由表的有序性可知,R[mid].key右侧的值都大于a,所以等于a的关键字如果存在,必然在R[mid].key左边的表中,这时high=mid-1;
B)如果R[mid].key这时low=mid;
C)如果R[mid].key=a,则查找成功。
(3)下一次查找针对新的查找区间,重复步骤
(1)和
(2)
(4)在查找过程中,low逐步增加,high逐步减少,如果high五、实验目的:
本实验通过实现快速排序和折半查找算法,使学生理解如何实现快速查找和排序的基本算法思想。
通过练习,加强对算法的理解,提高编程能力。
六、实验内容:
(1)实现数据序列的输入;
(2)实现快速排序算法,并对输入的序列排序后输出;
(3)实现折半查找算法,并在步骤
(2)排序后的序列上,进行任意地查找,并输出查询结果。
七、实验器材(设备、元器件):
PC机一台,装有C语言集成开发环境。
八、数据结构与程序:
#include
#include
#defineMAX1000
#defineFROMFILE1
typedefstructJD{
intkey;
}JD;
intbich(JDr[],intn,intk)
{intlow,high,mid,found;
low=1;high=n;found=0;
while((low<=high)&&(found==0))
{mid=(low+high)/2;
if(k>r[mid].key)low=mid+1;
elseif(k==r[mid].key)found=1;
elsehigh=mid-1;
}
if(found==1)
return(mid);
else
return(0);
}
voidquicksort(JDr[],intlow,inthigh){
inti,j,k;
JDx;
if(low>=high)return;
i=low;
j=high;
x=r[i];
while(iwhile((i=x.key))j--;if(iwhile((i}
r[i]=x;
quicksort(r,low,j-1);
quicksort(r,j+1,high);
}//快速排序
intmain(){
printf("欢迎使用快速排序与二分查找。
\n\n");
#ifdefFROMFILE
printf("请输入你所要查找的数组长度:
");intlength;
scanf("%d",&length);
getchar();
JDa[length+1];
a[0].key=0;
inti;
for(i=1;i<=length;i++){
printf("输入第%d个数字:
",i);
scanf("%d",&a[i].key);
getchar();
}
#else
FILE*fp;
fp=fopen("test.txt","r");
if(!
fp)
{
printf("文件不存在!
");
return0;
}
JDa[MAX];
a[0].key=0;
inti=1;
while(fscanf(fp,"%d",&a[i++].key)!
=EOF);
intlength=i-1;
printf("文件内的信息:
");
for(i=1;iprintf("%d",a[i].key);
}
printf("\n");
length--;
fclose(fp);
#endif
quicksort(a,0,length);
printf("\n");
intkey;
printf("请输入你想查找的数字:
");
scanf("%d",&key);
getchar();
printf("\n");
intlocation=bich(a,length,key);
printf("位置:
");
for(i=1;i<=length;i++){
printf("%3d",i);
}
printf("\n");
printf("数字:
");
for(i=1;i<=length;i++){
printf("%3d",a[i].key);
}
printf("\n");
if(location){
intcount=0;
printf("目标数字出现的位置:
");