1、通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就象水底下的气泡一样逐渐向上冒。冒泡排序算法如下:void bubblesort(int a,int n)/冒泡排序C语言描述,待排序的元素放在数组a中 int i,j; int temp; for(i=0;ii;j-) if(aj-1aj) temp=aj-1; aj-1=aj; aj=temp; 2.快速排序 任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的
2、排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。void quicksort(int a,int start,int end)/快速排序 int i,j,mid; i=start; j=end; mid=ai; while(start=end)return; while(imid)j-; if(ij)ai=aj;i+; aimid)i+; if(ij)aj=ai;j-; ai=mid; quicksort(a,start,i-1);/递归调用快速排序继续对前半部分的元素进行排序 quicksort(a,i+1,en
3、d);/ 递归调用快速排序继续对后半部分的元素进行排序3.选择排序假设待排序的列表的n个数据元素放在数组a中,第一次从n个数据元素中找出最小的元素与a0交换,第二次从剩下的n-1个元素中找出最小的元素与a1交换,直到第n-1次在剩下的两个元素中找出最小的元素与an-1交换,剩下的最后一个元素的位置就在an.选择排序算法如下:void selectsort(int a,int n)/选择排序 int min,temp; min=i; for(j=i+1;jn;j+) if(ajamin) min=j; temp=amin; amin=ai; ai=temp;第三章:测试结果(Testing Re
4、sults) 算 法随机数组元素个数(个)算法排序时间(seconds) 冒泡排序10000.0030020000.009000 30000.021000 40000.039000 50000.069000 100000.269000 快速排序0.008000 0.014000 0.028000 0.041000 0.022000 0.002000 选择排序0.005000 0.042000 0.049000 0.035000 0.159000 三种算法排序时间散点图注:横轴为随机数个数,纵轴为排序时间(1/100)第4章:分析和讨论如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-
5、1次相邻元素的两两比较,在第j趟比较中要进行n-j次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位置),最大值沉底为升序,最小值沉底为降序。(1)算法的最好时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数J和记录移动次数I均达到最小值: Jmin =n-1 Imin =0。 冒泡排序最好的时间复杂度为O(n)。(2)算法的最坏时间复杂度 若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1in-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值: Jmax =n
6、(n-1)/2=O(n2 ) Imax =3n(n-1)/2=O(n2 ) 冒泡排序的最坏时间复杂度为O(n2 )。(3)算法的平均时间复杂度为O(n2 ) 虽然冒泡排序不一定要进行n-1趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。(4)算法稳定性 冒泡排序是就地排序,且它是稳定的。(1)算法的最坏时间复杂度无论适用哪一种方法来选择基准pivot,由于我们不知道各个元素间的相对大小关系(若知道就已经排好序了),所以我们无法确定pivot的选择对划分造成的影响。因此对各种pivot选择法而言,最坏情况和最好情况都是相同的。我们从直觉上可以判断出最坏情况发生在每次划分过程
7、产生的两个区间分别包含n-1个元素和1个元素的时候(设输入的表有n个元素)。下面我们暂时认为该猜测正确,在后文我们再详细证明该猜测。对于有n个元素的表pi,由于函数Partition的计算时间为(n),所以快速排序在序坏情况下的复杂性有递归式如下:T(1)=(1),T(n)=T(n-1)+T(1)+(n) (1)用迭代法可以解出上式的解为T(n)=(n2)。这个最坏情况运行时间与插入排序是一样的。下面我们来证明这种每次划分过程产生的两个区间分别包含n-1个元素和1个元素的情况就是最坏情况。设T(n)是过程quicksort作用于规模为n的输入上的最坏情况的时间,则T(n)=max(T(i)+T
8、(n-i)+(n),其中1in-1 (2)我们假设对于任何kmj) temp=mj-1; mj-1=mj; mj=temp; void selectsort(int k,int n)/选择排序算法,待排序元素存放在数组k中 if(kjkmin) temp=kmin; kmin=ki; ki=temp;void quicksort(int p,int start,int end)/快速排序算法,待排序元素存放在数组p中 mid=pi;=end) return; while(imid) j-; pi=pj; i+; pi pj=pi; pi=mid;quicksort(p,start,i-1);/
9、递归调用快速排序对数组前半部分元素进行排quicksort(p,i+1,end);/ 递归调用快速排序继续对数组后半部分元素进行排序int main()/返回值类型为整型的主函数 int i; long start,end;/定义两个存放时间的变量 double duration;/定义一个存放计算时间的变量int *a;/定义指针变量为随机数分配存储空间 a=(int*)malloc(sizeof(int)*SIZE);/分配SIZE字节的存储空间 srand(unsigned)time(NULL);/设置时间作为随机函数的种子SIZE;i+)/随机赋值 ai=rand()%SIZE;/取0
10、,SIZE间的随机整数/如果PRT_RT=1,则输出待排序的序列,否则输出:“不输出待排序序列” if(PRT_RT = 1) printf(%d ,ai);/输出这个数组 else不输出待排序序列); printf(n printf(各种算法排序时间及排序后序列如下: /以下统计冒泡排序时间 start=clock();bubblesort(a,SIZE);/在这里插入你要计算时间的算法,这里计算的是冒泡排序算法当规模为SIZE的时候的算法的时间 end = clock(); duration=(double)(end-start)/CLOCKS_PER_SEC;the bubblesort
11、 time is :%f seconds,duration);/输出冒泡排序时间/以下显示冒泡排序结果,如果PRT_RT=1,则输出排序后的序列,否则输出:“不输出冒泡排序后序列” if(PRT_RT = 1) for(i=0; i i+), ai); else不输出冒泡排序后的序列 system(pause /以下统计快速排序时间 start = clock(); quicksort(a,0,SIZE-1);/在这里插入你要计算时间的算法,这里计算的是快速排序算法当规模为SIZE的时候的算法的时间 duration = (double)(end-start)/CLOCKS_PER_SEC;p
12、rintf(the quicksort time is :/输出统计最后时间 if(PRT_RT = 1)不输出快速排序后的序列 /以下统计选择排序时间selectsort(a,SIZE);/在这里插入你要计算时间的算法,这里计算的是选择排序算法当规模为SIZE的时候的算法的时间 the selectsort time is :/输出选择排序时间“不输出选择排序后序列” %d不输出选择排序后的序列 return 0;声明 我们在此声明,这个题为“各种排序算法的性能测试”的项目的所有工作是由作为一组的我们的成员的各自的努力而完成的。人员安排:程序员:余武丹测试员:李红波报告书写员:刘红梅完成日期:2013年9月4日THANKS !致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1