六种简单排序结构运行时间比较

来源:互联网 发布:淘宝扫码领红包怎么扫 编辑:程序博客网 时间: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
原创粉丝点击