预览加载中,请您耐心等待几秒...
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

南京邮电大学通达学院实验报告实验名称:快速排序算法课程名称:微型计算机原理与接口技术姓名班级学号:钱煜中14250114250120实验时间:2016.12.2快速排序原理实验原理:快速排序算法quicksort主要是利用分治递归的思想进行排序的方法。它的原理是首先从待排序的原始序列a[p,…,r]中选取一个元素a[q]作为分界点(pivot),然后将序列分为两个子序列,左边子序列a[p,…,q-1]元素的值都小于分界点m,右边子序列a[q+1,…,r]元素值都大于分界点的值,此时得到的序列命名为a’,而a[q]应该处于其排好序后的正确位置。然后利用递归的思想,对左右两个子序列a[p,…,q-1]和a[q+1,…,r]再分别进行排序,直到子序列的长度为1结束,序列有序。其中,选取a中的基准分界点的方式有多种,或者选择序列的首元素a[p],或者选择序列的尾元素a[r],或者选择序列中间位置的元素a[(p+r)/2],或者取这三个元素按照大小排序后的中间值。例子:a=[38,81,22,48,13,69,93,14,45,58,79,72],取[(left+right)/2]处的元素作为分界点(pivot)的值。具体第一次分区过程如下:因此,第一次分区,以69为分界点,结果为:a’=[14,58,22,48,13,38,45,69,93,81,79,72]。实验代码#include<stdio.h>intfast_sort(int*a,inti,intj,int*p,int**b){intk,temp,f,g;g=*p;g=(12*g)-12;//intf("成功进入快速排序g=%d\n",g);k=i;i++;for(;i<j;){for(;a[j]>a[k]&&i<j;){j--;}for(;a[i]<a[k]&&i<j;){i++;}//intf("i=%d\n",i);if(i==j)break;if(i<j);{temp=a[i];a[i]=a[j];a[j]=temp;}}if(a[k]>a[j]){temp=a[k];a[k]=a[j];a[j]=temp;}//r(f=0;f<12;f++)////intf("%3d",a[f]);////printf("排序成功\n");for(f=0;f<12;f++){*(b+g+f)=a[f];}returnj;}voiddigui(int*a,inti,intj,int*p,int**b,int*z){intk;if(i<j){//intf("成功进入递归p=%d\n",*p);*p=*p+1;k=fast_sort(a,i,j,p,b);digui(a,i,k-1,p,b,z);digui(a,k+1,j,p,b,z);if(*p>*z)*z=*p;//printf("z=%d\np=%d",*z,*p);*p=*p-1;}}voidmain(){inta[]={38,81,22,48,13,69,93,14,45,58,79,72};intb[10][12];inty=0,k,x=0,z=0;printf("初始序列为");for(k=0;k<12;k++){printf("%3d",a[k]);}printf("\n");digui(a,0,11,&x,b,&z);for(y=1;y<z+1;y++){printf("第%2d次后的数组为",y);for(k=0;k<12;k++)printf("%3d",b[y-1][k]);printf("\n");}}实验数据(给出实验结果)对序列a=[38,81,22,48,13,69,93,14,45,58,79,72]388122481369931445587972381422481369938