六种简单排序结构运行时间比较
来源:互联网 发布:淘宝扫码领红包怎么扫 编辑:程序博客网 时间:2024/05/21 17:52
#include<stdio.h>
#include<stdlib.h>#include<time.h>typedef struct{int key;//关键字项}keytype;//数据元素类型typedef struct{keytype r[200010];//r[0]闲置或者充当前哨站int length;//顺序表长度}Sqlist;//顺序表类型//生成随机数void creat(Sqlist *l){int i;printf("请输入要产生的随机数个数:");scanf("%d",&l->length);srand((unsigned)time(NULL));//随机种子printf("\n");for(i=1;i<=l->length;i++){l->r[i].key=rand()%200010;/*产生一定范围随机数的通用表示公式要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)*/printf(" %-20.2d ",l->r[i].key);}printf("\n");}void StraightInsertSort(Sqlist *l)//对顺序表中的l->length作 直接插入排序{int i,j;for(i=2;i<=l->length;i++){l->r[0]=l->r[i];//复制到前哨站j=i-1;while(l->r[0].key<l->r[j].key){l->r[j+1]=l->r[j];j--;} //记录后移l->r[j+1]=l->r[0];}}void BinaryInsertSort(Sqlist *l)//对顺序表作 折半插入排序{ int low,high,mid,i,j; for(i=2;i<=l->length;i++) { l->r[0]=l->r[i]; //保存待插入元素 low=1; high=i-1;//设置初始区间 while(low<=high)//该循环语句完成确定插入位置 { mid=(low+high)/2; if(l->r[0].key>=l->r[mid].key) { low=mid+1;//插入位置在高半区中 } else high=mid-1;//插入位置在低半区中 } for(j=i-1;j>=high+1;j--)//high+1为插入位置 { l->r[j+1]=l->r[j];//后移元素.留出插入空位 } l->r[high+1]=l->r[0];//将元素插入 }}int QuickSort1(Sqlist *l,int low,int high) /*一趟快速排序|| 交换顺序表中子表的记录, 使轴值(支点)记录到位, 并返回其所在位置*/{int pivotkey;l->r[0]=l->r[low]; //以字表的第一个记录作为轴值(支点)记录pivotkey=l->r[low].key; //取轴值(支点)记录关键字while(low<high) //从表的两端交替地向中间扫描{while(low<high&&l->r[high].key>=pivotkey)high--;l->r[low]=l->r[high]; //将比轴值记录小的交换到低端while(low<high&&l->r[low].key<=pivotkey)low++;l->r[high]=l->r[low]; //将比轴值记录大的交换到高端}l->r[low]=l->r[0]; //轴值记录到位return low; //返回轴值记录所在位置}void QuickSort(Sqlist *l,int low,int high)//递归形式的快速排序{int pivotloc;if(low<high){pivotloc=QuickSort1(l,low,high); //将待排序序列一分为二QuickSort(l,low,pivotloc-1); //对小于轴值序列实现递归排序QuickSort(l,pivotloc+1,high); //对大于轴值序列实现递归排序}}void heapadjust(Sqlist *h,int s,int m)//堆排列{keytype rc;int j;rc=h->r[s];for (j=2*s;j<=m;j*=2)//沿关键字较大的孩子结点向下筛选{if(j<m&&h->r[j].key<h->r[j+1].key)++j;//为关键字较大的元素下表if(rc.key>=h->r[j].key)//r应插入在位置i上break;h->r[s]=h->r[j];s=j;//使i结点满足堆定义}h->r[s]=rc;//插入}void heapsort(Sqlist *h){keytype rc;int i;for(i=h->length/2;i>0;--i)//将r建成堆heapadjust(h,i,h->length);for(i=h->length;i>1;--i){rc=h->r[1];h->r[1]=h->r[i];h->r[i]=rc;//堆顶与堆底元素交换,将最大元素移到后面heapadjust(h,1,i-1);//将其重新调整为堆}}//冒泡排序void BubbleSort(Sqlist *l){int i,j;for(i=1;i<=l->length-1;i++){for(j=2;j<=1+l->length-i;j++) //进行n-1趟排序if(l->r[j].key<l->r[j-1].key){l->r[0]=l->r[j];l->r[j]=l->r[j-1];l->r[j-1]=l->r[0];//交换}}}//简单选择排序void SelectSort(Sqlist *l){int i,j,t,tmp;for(i=1;i<l->length;i++)//作l->length-1趟选取{for(j=i+1,t=i;j<=l->length;j++)//从i开始的length-1条待排序记录中选关键字最小的记录{if(l->r[t].key>l->r[j].key)t=j; //t中存放关键字最小的记录下标}tmp=l->r[t].key;l->r[t].key=l->r[i].key;l->r[i].key=tmp; //关键字最小的记录与第i条记录交换}}//显示顺序表void display(Sqlist *l){int i; //for (i=1;i<=l->length;i++) //输出顺序//printf("%-4.2d",i);//printf("\n");//for(i=1;i<=2*l->length;i++) //输出分隔符//printf(" #_# ");//printf("\n");for(i=1;i<=l->length;i++) //输出排列好的数printf(" %-10.2d ",l->r[i].key);}//主函数void main(){ int t1,t2,t3,t4,t5,t6,t7,t8; t1 = clock();Sqlist t;creat(&t);QuickSort(&t,1,t.length);printf("\n");printf("快速排序:\n");display(&t);printf("\n\n");t2 = clock();heapsort(&t);printf("\n");printf("堆排列:\n");display(&t);printf("\n\n");t3 = clock();StraightInsertSort(&t);printf("\n");printf("直接插入排序:\n");display(&t);printf("\n\n");t4 = clock();BinaryInsertSort(&t);printf("\n");printf("折半插入排序:\n");display(&t);printf("\n\n");t5 = clock();BubbleSort(&t);printf("\n");printf("冒泡排序:\n");display(&t);printf("\n\n");t6 = clock();SelectSort(&t);printf("\n");printf("简单选择排序:\n");display(&t);printf("\n\n");t7 = clock(); printf("\n\n\n\n\n快速排序 所需时间为: %d\n",t2-t1);printf("堆排列 所需时间为: %d\n",t3-t2);printf("直接插入排序 所需时间为: %d\n",t4-t3);printf("折半插入排序 所需时间为: %d\n",t5-t4);printf("冒泡排序 所需时间为: %d\n",t6-t5);printf("简单选择排序 所需时间为: %d",t7-t6);}
0 0
- 六种简单排序结构运行时间比较
- 几种排序算法运行时间比较
- 体验复杂度 2种排序方法的运行时间比较
- 简单排序算法运行效率比较
- 冒泡排序运行的时间和归并排序运行时间的比较
- 第二周项目3 体验复杂度(比较两种排序算法的运行时间)
- MFC写的排序算法简单时间比较
- 排序算法时间比较
- 排序算法时间比较
- 时间排序比较器
- 数据结构简单的六种排序算法
- 排序并比较排序时间
- STL 排序比较(六)
- 几种结构模式的简单比较
- 两种排序算法的运行时间
- 算法运行时间的比较
- 算法--算法运行时间比较
- 几种简单排序的比较
- 进程间通信---共享内存
- 在Mac系统下合并pdf文件
- Tomcat 7 Windows中以Service方式启动配置启动参数
- 哈夫曼树的创建与打印
- 4种访问权限及this引用
- 六种简单排序结构运行时间比较
- openwrt生成固件firmware过程
- WebRTC中的拥塞控制 二: RTP in WebRTC
- android多屏适配
- eclipse配置一
- 一日三醒吾身
- Android Data Binding(一)
- 数据结构实验:连通分量个数
- 自定义圆去除边角只有圆可以点击