排序算法比较排序算法排序算法比较排序算法比较

源代码在线查看: 排序算法比较未完成.cpp

软件大小: 3 K
上传用户: cdcgl
关键词: 排序算法 比较
下载地址: 免注册下载 普通下载 VIP

相关代码

				/*
				题目:2、排序算法比较 (必做)
				设计要求:利用随机函数产生N个随机整数(N = 500,1000,1500,2000,2500,…,30000),
				利用直接插入排序、折半插入排序,起泡排序、快速排序、选择排序、堆排序,基数排序七种排序方法
				(可添加其它排序方法)进行排序(结果为由小到大的顺序),并统计每一种排序所耗费的时间。
				时间:2008年1月6日   作者:付斌   学号:040640319*/
				#include "stdio.h"
				#include "stdlib.h"
				#include "time.h"
				#define Maxsize  50000
				
				typedef struct
				{
				
					int key;
				
				}Redtype;
				
				typedef struct
				{
				
					Redtype r[Maxsize+1];
					
					int length;
				
				}Sqlist;
				
				void Initlist(Sqlist &L,int n)                              //初始化表(参数n为要参加排序的数的个数)
				{
					int i;
				
					srand( (unsigned)time( NULL ) );						//随机产生种子
					
					for(i=1;i					
						L.r[i].key=n*rand()/(n+1.0);							// rand()产生伪随机数0 到n
					
					L.length=n+1;
				}//Initlist
				
				void Printlist (Sqlist L )
				
				{	
					int i;
					
					printf("排序后的线性表为:");
					
					for (i=1;i					
					 printf("%d  ",L.r[i]);
				
				}
				
				
				
				void Insertionsort(Sqlist L)                       //直接插入排序(书上的算法)
				{
					
					int i,j;
					
					for(i=2;i					
						if(	L.r[i].key					{
					
							L.r[0]=L.r[i];							//复制为哨兵
					
							L.r[i]=L.r[i-1];						
					
							for(j=i-2;L.r[0].key						
								L.r[j+1]=L.r[j];					//记录后移
					
							L.r[j+1]=L.r[0];						//插入到正确位置
					
					}
					//Printlist (L);								//测试用
				
				}//Insert_Sort
				
				
				void Binsertsort(Sqlist L)                         //折半排序(书上的算法)
				{
				
					int i,j;
					
					int low,high;
					
					for(i=2;i					
					{
						L.r[0]=L.r[i];								//将L.r[i]暂存到L.r[0]
					
						low=1; 
					
						high=i-1;
					
						while(low					
						{
						
							int m=(low+high)/2;						//折半
							
							if(L.r[0].key								
								high=m-1;
						
							else									//插入点在高半区
							
								low=m+1;
						}
						
						for(j=i-1;j>=high+1;--j)					
						
							L.r[j+1]=L.r[j];						//记录后移
						
						L.r[high+1]=L.r[0];							//插入
				
					}
				
					//Printlist (L);								//测试用
				
				}//Binsert_sort
				
				
				void Electsort(Sqlist L)                        //选择排序
				{
					
					int min,j;
					
					for(int i=1;i					
					{
				        
						min=i;
						
						for(j=min+1;j						
							if(L.r[min].key>L.r[j].key)
							
								min=j;
						
							if(min!=i)							//判断min与i是否相等,若=则说明原假设正确反之交换数值
							{
							
								L.r[0]=L.r[min];
							
								L.r[min]=L.r[i];
							
								L.r[i]=L.r[0];				//L.r[i]作一个temp,
						
							}
					}
				
					//Printlist (L);								//测试用
				
				}//Elect_sort
				
				
				void Bubblesort(Sqlist L)                     //普通冒泡排序
				{
					
					int i,j;
				
					for(i=1;i					
						for(j=1;j						
							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];
						
							}
				
					//Printlist (L);									//测试用					
				
				}//Bubble_sort
				
				
				void Heapadjust(Sqlist &L,int s,int m)			//堆排序中的筛选
				{
					
					int j,rc;
				
					rc=L.r[s].key;
					
					for(j=s*2;j					
					{
						if(j						
							++j;
						
						if(rc>L.r[j].key)				//L.r[0]应当插入在位置s上
						
							break;
					
						L.r[s]=L.r[j];
				
						s=j;
				
					}
				
					L.r[s].key=rc;								//插入
				}
				
				
				void Heapsort(Sqlist L)                //堆排序(书上算法)
				{
					
					int i,t;
					
					for(i=L.length/2;i>0;--i)
					
						Heapadjust(L,i,L.length);
					
					for(i=L.length;i>1;--i)
					
					{
					
						t=L.r[1].key;
					
						L.r[1]=L.r[i];
					
						L.r[i].key=t;
					
						Heapadjust(L,1,i-1);
					}
				
					//Printlist (L);									//测试用
				
				}//Heap_sort
				
				
				int Partition(Sqlist &L,int low,int high)
				
				{	
					int pivotkey;
					
					L.r[0]=L.r[low];
					
					pivotkey=L.r[low].key;
					
					while(low					{
						while(low=pivotkey) --high;
						
							L.r[low]=L.r[high];
						
						while(low				
							L.r[high]=L.r[low];
					}
				
					L.r[low]=L.r[0];
				
					return low;
				
				}//Partition;
				
				void Quicksort(Sqlist &L,int low,int high)
				{
					int pivotloc;
					
					if (low				
					{ 
					pivotloc=Partition(L,low,high);
				 
					Quicksort(L,low,pivotloc-1);
				 
					Quicksort(L,pivotloc+1,high);
					
					}
				
				}//Quicksort
				
				
				
				void main()
				{
					Sqlist List;
				
					clock_t starttime;									//开始计时的变量
					
					clock_t endtime;								    //结束计时的变量
					
					double totaltime1,totaltime2,totaltime3,totaltime4,
						
					totaltime5,totaltime6,totaltime7;									//计时变量
				    
					int  i,number;									    //排序数的个数
				    
					char ch;
				
					printf("输入要随机排序数的个数:   ");
					
					scanf("%d", &number);
					
					printf("\n请稍后...正在计算排序时间...\n");
				
					Initlist(List,number);
				
					starttime=clock();								    //直接插入排序
					
					Insertionsort(List);
					
					endtime=clock();
					
					totaltime1=(double)(endtime-starttime)/1000;
					
					starttime=clock();									//折半插入排序
					
					Binsertsort(List);
				
					endtime=clock();
					
					totaltime2=(double)(endtime-starttime)/1000;
					
					starttime=clock();									//选择排序
					
					Electsort(List); 
					
					endtime=clock();
				
					totaltime3=(double)(endtime-starttime)/1000;
					   
					starttime=clock();									//冒泡排序
				    
					Bubblesort(List); 
					
					endtime=clock();
					
					totaltime4=(double)(endtime-starttime)/1000;
				
					starttime=clock();									//堆排序
				   
					Heapsort(List); 
					
					endtime=clock();
				
					totaltime5=(double)(endtime-starttime)/1000;
					
					starttime=clock();									//快速排序
				    
					Quicksort(List,1,List.length-1); 
				
					endtime=clock();
					
					totaltime6=(double)(endtime-starttime)/1000;
					
					printf("\n“直接插入排序”的时间是:  %f s \n\n",totaltime1);
					
					printf("\n“折半插入排序”的时间是:  %f s \n\n",totaltime2);
					
					printf("\n“选择排序”的时间是:  %f s \n\n",totaltime3);
					
					printf("\n“普通冒泡排序”的时间是:  %f s\n \n",totaltime4);
					
					printf("\n“堆排序”的时间是:  %f s\n \n",totaltime5);
					
					printf("\n“快速排序”的时间是:  %f s\n \n",totaltime6);	
					
					printf("是否需要打印出排序后的随机序列?(Y/N)\n");
					
					scanf("%s",&ch);
					
					if(ch=='Y'||ch=='y')
						
						Printlist (List);
					
					else
					{
						printf("如需从新排列请输入1;\n");
						
						printf("如要退出该程序请出入0;\n");
				
						scanf("%s",&ch);
				
						if(ch=='1')
					
					
					}
				
				}
				
				
				
							

相关资源