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

2026/1/26 23:38:45

快速排序

一、 问题描述

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

只需要将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把数组分成了两个子数组。分别对两个子数组,进行类似的操作,便能得到正确的排序结果。

程序的流程

输入事件件数n-->随机产生做完没个事件所需时间-->对n个时间进行 排序-->输出结果

快速排序方法(因图难画,举一个实例): 初始状态 72 6 57 88 85 42 l r 第一趟循环 72 6 57 88 85 42 l r 第一次交换 6 72 57 88 85 42 l r 第二趟循环 6 72 57 88 85 42 r l 第二次交换 72 6 57 88 85 42 r l

反转交换 6 72 57 88 85 42 r l

这就是依靠轴值,将数组分成两部分的实例(特殊情况下,可能为一部分,其中42是轴值)。对分成的两部分数组,分别尽心类似的操作,便可得符合要求的结果。

快速排序的函数模块;

void qsort(int* array,int l,int r) {

if(r<=l) return;

int pivotIndex=l+rand()%(r-l+1);//随机选定轴值

swap1(array,pivotIndex,r);//将选定的轴值放到每段数组的最后 int k=partition(array,l-1,r,array[r]); //依靠轴值,将数组分//成两部分

swap1(array,k,r);//将轴值放到正确的位置上

qsort(array,l,k-1);//递归调用,对数组左右两部分进行排序 qsort(array,k+1,r); }

/*将大于轴值的放右边,小于轴值的放左边 算法实现*/ int partition(int* array,int l,int r,const int pivot) {

do{

while(array[++l]

while((r!=0)&&(array[--r]>pivot)); swap1(array,l,r);

}while(l

}

swap1(array,l,r); return l;

算法的时空分析

快速排序在最差情况下,时间代价为Θ(n2),但很少出现这种情况。如果快速排序找到了完美的轴值,那么整个算法的时间代价为Θ(n㏒n)。

输入和输出的格式

输入

n= //提示 等待输入 输出

原始序列: //提示 随机产生的n个随机数 结果: //提示 正确的排序结果

四、 测试结果

五、 实验心得(可选)

这个实验,不难。但是关键在于理解快速排序的那个过程,如何根据轴值将数组分成两部分,然后将轴值放到合适的位置,继续对分成两部分的数组,执行类似的操作。

六、 附录(实验源码)

#include #include using namespace std;

//产生n个随机数,存储到数组 int* crtArray(int& size) { int n; cout << \

cin >> n;

//设置随机种子

srand(time(NULL)); int* intArray=new int[n]; size=n;

cout << \原始序列:\for(int i=0;i

intArray[i]=rand(); if(intArray[i]==0) { i--; continue; } cout << intArray[i] << \ }

cout << endl; return intArray;

}

//交换数组中的两个值

void swap1(int* array,int& a,int& b) { int temp=array[a]; array[a]=array[b]; array[b]=temp; }

//对指定的数组部分进行分割

int partition(int* array,int l,int r,const int pivot) { do{ while(array[++l]=pivot)); swap1(array,l,r); }while(l

//快速排序的实现部分

void qsort(int* array,int l,int r) { if(r<=l) return; int pivotIndex=r; int k=partition(array,l-1,r,array[r]); swap1(array,k,r); qsort(array,l,k-1); qsort(array,k+1,r); }

/*主函数*/ int main() { int size; int* Array; Array=crtArray(size); qsort(Array,0,size-1); cout << \结果:\ for(int i=0;i


快速排序(实验报告附C++源码).doc 将本文的Word文档下载到电脑
搜索更多关于: 快速排序(实验报告附C++源码) 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219