快速排序
一、 问题描述
在操作系统中,我们总是希望以最短的时间处理完所有的任务。但事情总是要一件件地做,任务也要操作系统一件件地处理。当操作系统处理一件任务时,其他待处理的任务就需要等待。虽然所有任务的处理时间不能降低,但我们可以安排它们的处理顺序,将耗时少的任务先处理,耗时多的任务后处理,这样就可以使所有任务等待的时间和最小。
只需要将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 //产生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] //快速排序的实现部分 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

