参考文档快速排序算法实验报告推荐word版 17页.docx

上传人:b****5 文档编号:6509929 上传时间:2023-01-07 格式:DOCX 页数:14 大小:20.41KB
下载 相关 举报
参考文档快速排序算法实验报告推荐word版 17页.docx_第1页
第1页 / 共14页
参考文档快速排序算法实验报告推荐word版 17页.docx_第2页
第2页 / 共14页
参考文档快速排序算法实验报告推荐word版 17页.docx_第3页
第3页 / 共14页
参考文档快速排序算法实验报告推荐word版 17页.docx_第4页
第4页 / 共14页
参考文档快速排序算法实验报告推荐word版 17页.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

参考文档快速排序算法实验报告推荐word版 17页.docx

《参考文档快速排序算法实验报告推荐word版 17页.docx》由会员分享,可在线阅读,更多相关《参考文档快速排序算法实验报告推荐word版 17页.docx(14页珍藏版)》请在冰豆网上搜索。

参考文档快速排序算法实验报告推荐word版 17页.docx

参考文档快速排序算法实验报告推荐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(i

while((i=x.key))j--;if(i

while((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;i

printf("%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("目标数字出现的位置:

");

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1