快速排序和合并排序的比较(时间和比较步数)
2013-05-25 22:20
381 查看
/*************************************************************************** Program: Compare the time between merragesort and quitsort. History: 2013/04/21 dingdong 完成基本排序算法 2013/04/29 dingdong 实现随机功能,输出时间以及布数,优化了界面。 ****************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<time.h> int merge_count,quick_count;//两个算法中比较的次数 /************mergesort*************/ void merge(int *,int,int,int); void mergesort(int *,int,int); /************quicksort************/ int split(int *,int,int); void quicksort(int *,int,int); /**************main***************/ int main(void) { int time,*a,*b; clock_t start,finish; srand(1);//set seed printf("**************************************************************\n"); printf("*This Program will print the average time between mergesort *\n"); printf("*and quictsort and the comparative step of each other. *\n"); printf("**************************************************************\n"); /*make 20 group data randomly,n=5000*i,1<=i<=20*/ for(int i=1;i<21;i++) { a=(int *)malloc(sizeof(int)*(5000*i+1));//for mergesort,空间多开辟了一个,因为初始值从1开始的 b=(int *)malloc(sizeof(int)*(5000*i+1));//for quicksort,空间多开辟了一个,因为初始值从1开始的 merge_count=0; quick_count=0; for(int j=1;j<5000*i+1;j++)//make array ramdanly { a[j]=rand()%100; b[j]=a[j]; } printf("***********************************************\n"); printf("The number %d group:\n",i); /*********mergesort's time***********/ start=clock(); mergesort(a,1,5000*i); finish=clock(); time=finish-start; printf("MerageSort use %-5d ms and %-8d steps.\n",time,merge_count); /*********quicksort's time***********/ start=clock(); quicksort(b,1,5000*i); finish=clock(); time=finish-start; printf("QuickSort use %-5d ms and %-8d steps.\n",time,quick_count); getchar();//让控制台初与等待输入的状态 free(a);//free memory a=NULL; free(b);//free memory b=NULL; } return 0; } /********************mergesort***********************/ void merge(int *a,int low,int mid,int high) { int *c=(int *)malloc(sizeof(int)*(high+1));//空间多开辟了一个,因为初始值从1开始的。 int s=low,q=mid,t=mid+1,k=low,r=high; while(s<=q&&t<=r) { if(a[s]<=a[t]) { merge_count++; c[k]=a[s]; s++; } else { c[k]=a[t]; t++; } k++; } if(s==q+1) { for(;t<=r;k++,t++) c[k]=a[t]; } else { for(;s<=q;k++,s++) c[k]=a[s]; } for(int i=low;i<=high;i++) a[i]=c[i]; free(c); c=NULL; } void mergesort(int *a,int low,int high) { int mid; if(low<high) { mid=(high+low)/2; mergesort(a,low,mid); mergesort(a,mid+1,high); merge(a,low,mid,high); } } /*********************quicksort************************/ int split(int *a,int low,int high) { int i=low; int x=a[low],temp;//temp for exchange for(int j=low+1;j<=high;j++) { if(a[j]<=x) { quick_count++; i++; if(i!=j) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } temp=a[low]; a[low]=a[i]; a[i]=temp; return i; } void quicksort(int *a,int low,int high) { int mid; if(low<high) { mid=split(a,low,high); quicksort(a,low,mid-1); quicksort(a,mid+1,high); } }随机产生20组数据(比如n=5000i,1≤i≤20)。数据均属于范围(0,105)内的整数。对于同一组数据,运行快速排序和归并排序算法,并记录各自的运行时间(以毫秒为单位),以及记录它们各自的比较步数。(虽然快排的比较步数比较多,但是速度比合并排序快很多,特别是数据量越大的时候,这个越能体现)
相关文章推荐
- 快速排序与合并排序时间比较(适合初学者)
- sql 排序按修改时间,诺修改时间为空与创建时间比较
- python_lintcode_64合并排序数组 II_60搜索插入位置_142 O(1)时间检测2的幂次
- spring JPA 实体创建 分页排序 时间比较
- 快速排序、合并排序、基数排序时间复杂度
- 冒泡和Arrays类提供的快速排序比较时间
- 堆排序和快速排序性能比较
- C++的STL库,vector sort排序时间复杂度 及常见容器比较
- 最坏情况下,合并两个大小为n的已排序数组所需要的比较次数
- [Algorithms] 分治算法(二分查找, 合并排序, 插入排序, 快速排序(coming))
- 6.比较排序之快速排序
- 选择排序和快速排序性能比较
- 插入排序,归并排序,快速排序时间效率测试
- 交换排序之快速排序原理、源码及时间、空间复杂度
- 最坏情况下,合并两个大小为n的已排序数组所需要的比较次数为
- 冒泡排序,选择排序,插入排序,快速排序的比较及优化
- 基于比较的排序,时间复杂度下界是o(nlogn)的小证明
- 快速排序与归并排序时间对比
- 冒泡排序运行的时间和归并排序运行时间的比较
- 线性时间排序的性能比较