其他分享
首页 > 其他分享> > 多种排序方法

多种排序方法

作者:互联网

多种排序方法及验证

编译环境:Microsoft Visual C++2010学习版
参考教材:数据结构:C语言版/严蔚敏,李冬梅,吴伟民编
备注:本文留作作者自用,如有错误敬请指出

内容描述

第一步,利用程序随机生成10000个在0-9999之间的数字,将10000个数据保存在数组A中
第二步,分别编写直接插入排序、折半插入排序、希尔排 序、冒泡排序、快速排序、简单选择排序、 归并排序算法程序(每个算法用函数封装)
第三步,调用每个排序方法对数组A进行排序,同时计算消耗时间,并输出。

实现代码

#include<iostream>
#include<cstdlib>
#include <time.h>
using namespace std;
#define MAXSIZE 10000
typedef int KeyType;
int i,j,low,high,m,k,flag,t,pivotkey;
typedef struct{
  KeyType key;
}RedType;//记录类型
RedType S[MAXSIZE+1];
typedef struct{
  RedType a[MAXSIZE+1];
  int length;
}SqList;//顺序表类型
void InsertSort(SqList &L){  //直接插入排序
	for( i=2;i<L.length;++i){
		if(L.a[i].key<L.a[i-1].key){
            L.a[0]=L.a[i];
			L.a[i]=L.a[i-1];
			for(j=i-2;L.a[0].key<L.a[j].key;--j){
               L.a[j+1]=L.a[j];			
			}
			L.a[j+1]=L.a[0];
		}
	}
}
//**********************************
void BInsertSort(SqList &L){   //折半插入排序
	for(i=2;i<=L.length;++i){
       L.a[0]=L.a[i];
	   low=1;
	   high=i-1;
	   while(low<=high){
          m=(low+high)/2;
		  if(L.a[0].key<L.a[m].key)
			  high=m-1;
		  else low=m+1;
	   }
	   for(j=i-1;j>=high+1;--j){
	      L.a[j+1]=L.a[j];
	   }
	   L.a[high+1]=L.a[0];
	}
}
//*********************************
void ShellInsert(SqList &L,int dk){  //希尔排序
	for(i=dk+1;i<=L.length;++i){
		if(L.a[i].key<L.a[i-dk].key){
		   L.a[0]=L.a[i];
		   for(j=i-dk;j>0 && L.a[0].key<L.a[j].key;j-=dk){
              L.a[j+dk]=L.a[j];		   
		   }
		   L.a[j+dk]=L.a[0];
		}
	}
}
void ShellSort(SqList &L){
	int dt[]={200,100,50,10,5,3,1};
	t=sizeof(dt)/sizeof(*dt);//求数组dt长度
    for(k=0;k<t;++k)
		ShellInsert(L,dt[k]);
}
//*********************************
void BubbleSort(SqList &L){   //冒泡排序
   m=L.length-1;
   flag=1;
   while(m>0 && flag==1){
      flag=0;
	  for(j=1;j<=m;++j){
		  if(L.a[j].key>L.a[j+1].key){
		     flag=1;
			 t=L.a[j].key;
			 L.a[j].key=L.a[j+1].key;
			 L.a[j+1].key=t;
		  }
	  }
	  --m;
   }
}
//*********************************
int Partition(SqList &L,int low,int high){   //快速排序
    L.a[0]=L.a[low];
	pivotkey=L.a[low].key;
	while(low<high){
	   while(low<high && L.a[high].key>=pivotkey)
		   --high;
	   L.a[low]=L.a[high];
	   while(low<high && L.a[low].key<=pivotkey)
		   ++low;
	   L.a[high]=L.a[low];
	}
	L.a[low]=L.a[0];
	return low;
}
void Qsort(SqList &L,int low,int high){
	if(low<high){
	   m=Partition(L,low,high);
	   Qsort(L,low,m-1);//对左子表递归排序
	   Qsort(L,m+1,high);//对右子表递归排序
	}
}
void QuickSort(SqList &L){
	Qsort(L,1,L.length);
}
//*********************************
void SelectSort(SqList &L){   //简单选择排序
	for(i=1;i<L.length;++i){
	   k=i;
	   for(j=i+1;j<=L.length;++j){
	      if(L.a[j].key<L.a[k].key)
			  k=j;
	   }
	   if(k!=i){
		  t=L.a[i].key;
		  L.a[i].key=L.a[k].key;
		  L.a[k].key=t;
	   }
	}
}
//*********************************
//用算法8.10 相邻两个有序子序列的归并
void Merge(RedType R[],RedType T[],int low,int mid,int high)
{ 
   //将有序表R[low..mid]和R[mid+1..high]归并为有序表T[low..high] 
	int i,j,k;
	i=low; j=mid+1;k=low; 
    while(i<=mid&&j<=high)
	{                 	
		//将R中记录由小到大地并入T中 
		if(R[i].key<=R[j].key) T[k++]=R[i++]; 
        else T[k++]=R[j++]; 
	} 
	while(i<=mid)                            		//将剩余的R[low..mid]复制到T中 
		T[k++]=R[i++];                 
	while(j<=high)                           		//将剩余的R[j.high]复制到T中 
		T[k++]=R[j++];                       
}//Merge 

void MSort(RedType R[],RedType T[],int low,int high)
{ 
	//R[low..high]归并排序后放入T[low..high]中 
	int mid;
	RedType *S=new RedType[MAXSIZE];
    if(low==high) T[low]=R[low]; 
    else
	{ 
		mid=(low+high)/2;       					//将当前序列一分为二,求出分裂点mid 
        MSort(R,S,low,mid);							//对子序列R[low..mid] 递归归并排序,结果放入S[low..mid] 
        MSort(R,S,mid+1,high);						//对子序列R[mid+1..high] 递归归并排序,结果放入S[mid+1..high] 
        Merge(S,T,low,mid,high);					//将S[low..mid]和S [mid+1..high]归并到T[low..high]  
    }//else 
}// MSort 
 
void MergeSort(SqList &L)
{ 
	//对顺序表L做归并排序 
    MSort(L.a,L.a,1,L.length); 
}//MergeSort 
void print(SqList &L){  //打印
	for(i=1;i<MAXSIZE+1;++i){
       cout<<L.a[i].key<<" ";
	   if(i%15==0)
		   cout<<endl;
	}
}
int main(){
	SqList L;
	L.length=MAXSIZE;
	srand((unsigned)time(NULL)); 
	for( i=1;i<MAXSIZE+1;++i){  //生成MAXSIZE个随机数作为关键字的值
	   L.a[i].key=rand()%MAXSIZE;
	}
time_t c_start, c_end;
c_start = clock();    // 单位为ms
//加入排序函数;
InsertSort(L);
c_end   = clock();
//!<difftime(time_t, time_t)返回两个time_t变量间的时间间隔,即时间差
printf("直接插入排序消耗 %f ms \n",difftime(c_end,c_start)); 
for( i=1;i<MAXSIZE+1;++i){  //生成MAXSIZE个随机数作为关键字的值
	   L.a[i].key=rand()%MAXSIZE;
	}
c_start = clock(); 
BInsertSort(L);
c_end   = clock();
printf("折半插入排序消耗 %f ms \n",difftime(c_end,c_start)); 
for( i=1;i<MAXSIZE+1;++i){  
	   L.a[i].key=rand()%MAXSIZE;
	}
c_start = clock(); 
ShellSort(L);
c_end   = clock();
printf("希尔排序消耗 %f ms \n",difftime(c_end,c_start)); 
for( i=1;i<MAXSIZE+1;++i){  
	   L.a[i].key=rand()%MAXSIZE;
	}
c_start = clock(); 
BubbleSort(L);
c_end   = clock();
printf("冒泡排序消耗 %f ms \n",difftime(c_end,c_start)); 
for( i=1;i<MAXSIZE+1;++i){  
	   L.a[i].key=rand()%MAXSIZE;
	}
c_start = clock(); 
	QuickSort(L);
c_end   = clock();
printf("快速排序消耗 %f ms \n",difftime(c_end,c_start)); 
for( i=1;i<MAXSIZE+1;++i){  
	   L.a[i].key=rand()%MAXSIZE;
	}
c_start = clock(); 
	SelectSort(L);
c_end   = clock();
printf("简单选择排序消耗 %f ms \n",difftime(c_end,c_start)); 
for( i=1;i<MAXSIZE+1;++i){  
	   L.a[i].key=rand()%MAXSIZE;
	}
c_start = clock(); 
MergeSort(L);
c_end   = clock();
printf("归并排序消耗 %f ms \n",difftime(c_end,c_start));
//print(L);
	system("pause");
    return 0;
}

标签:多种,clock,mid,high,low,key,排序,方法
来源: https://blog.csdn.net/weixin_51614848/article/details/122268149