排序总结

本文详细探讨了插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序和归并排序等常见排序算法的性能测试及实现细节,通过生成随机数数组并使用不同算法进行排序,记录每种算法的执行时间,从而直观比较各种排序算法在不同规模数据集上的效率差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* * ****************************************************** * Filename: sort_test.cpp * Version: 0.0.0.1 * Created: 2009-12-11 16:00:00 @ nbut * Last updated: none * Compiler: vc++ * Author: bird * * Discription: This is the cpp file of sort_test * ******************************************************** */ #include<iostream> #include<iomanip> #include<ctime> #include"Sort" using namespace std; const int SIZE=50000; int a[8][SIZE];//全局变量,放一组随即数 void CreateRand(){ srand((int )time(NULL)); for(int i=0;i<SIZE;++i){ int tmp=rand(); for(int j=0;j<8;++j) a[j][i]=tmp; } } void Disp(int a[],int n){ for(int i=0;i<n;++i){ cout<<setw(8)<<a[i]; } } int main(){ clock_t bgn,end; CreateRand(); bgn=clock(); InsertSort(a[0],SIZE); end=clock(); cout<<"InsertSort:"<<end-bgn<<"(ms)"<<endl; bgn=clock(); ShellSort(a[1],SIZE); end=clock(); cout<<"ShellSort:"<<end-bgn<<"(ms)"<<endl; bgn=clock(); SelectSort(a[2],SIZE); end=clock(); cout<<"SelectSort:"<<end-bgn<<"(ms)"<<endl; bgn=clock(); HeapSort(a[3],SIZE); end=clock(); cout<<"HeapSort:"<<end-bgn<<"(ms)"<<endl; bgn=clock(); BubbleSort(a[4],SIZE); end=clock(); cout<<"BubbleSort:"<<end-bgn<<"(ms)"<<endl; bgn=clock(); QuickSort(a[5],0,SIZE-1); end=clock(); cout<<"QuickSort:"<<end-bgn<<"(ms)"<<endl; bgn=clock(); MergeSort(a[6],SIZE); end=clock(); cout<<"MergeSort:"<<end-bgn<<"(ms)"<<endl; }

/* * ****************************************************** * Filename: Sort * Version: 0.0.0.1 * Created: 2009-12-11 16:00:00 @ nbut * Last updated: none * Compiler: vc++ * Author: bird * * Discription: This is the head file of self-sort_function * ******************************************************** */ //****直接插入************************** //稳定,O(n^2) void InsertSort(int a[],int n){ int tmp,j; for(int i=1;i<n;++i){ tmp=a[i]; j=i-1; while(j>=0 && tmp<a[j]){ a[j+1]=a[j];//后移 --j; } a[j+1]=tmp; } } //****希尔排序****************************** //不稳定,O(nlogn) void ShellSort(int a[],int n){ int j,gap,tmp; gap=n/2; while(gap>0){ for(int i=gap;i<n;++i){ tmp=a[i]; j=i-gap; while(j>=0 && tmp<a[j]){ a[j+gap]=a[j]; j=j-gap; } a[j+gap]=tmp; //j=j-gap; } gap/=2; } } //****直接选择**************************** //不稳定,O(n^2) void SelectSort(int a[],int n){ int tmp; for(int i=0;i<n-1;++i){//选到n-1就够了 int j,k=i;//假设i最小 for(j=i+1;j<n;++j)//从i+1开始找最小值下标 if(a[j]<a[k]) k=j; tmp=a[i]; a[i]=a[k]; a[k]=tmp; } } //****堆排序******************************* //不稳定,O(nlogn) void Sift(int a[],int low,int high){//筛选函数,调整堆 int i=low,j=2*i;//j为i的左孩子 int tmp=a[i]; while(j<=high){ if(j<high && a[j]<a[j+1])//如果右孩子比左孩子大 ++j;//j变为右孩子 if(tmp<a[j]){ a[i]=a[j]; i=j; j=2*i; } else break; } a[i]=tmp; } void HeapSort(int a[],int n){ int tmp; for(int i=n/2;i>=0;--i)//初始化堆 Sift(a,i,n); for(int i=n;i>=1;--i){ tmp=a[0]; a[0]=a[i]; a[i]=tmp; Sift(a,0,i-1); } } //****冒泡排序*************************** //稳定,O(n^2) void BubbleSort(int a[],int n){ int exchange,tmp; for(int i=0;i<n-1;++i){ exchange=0; for(int j=n-1;j>i;--j){//j从后面开始,找到最小的 if(a[j]<a[j-1]){//两两比较 tmp=a[j]; a[j]=a[j-1]; a[j-1]=tmp; exchange=1; } } if(exchange==0) return ; } } //****快速排序***************************** //不稳定,O(nlogn) void QuickSort(int a[],int s,int t){ int i=s,j=t,tmp; if(s<t){ tmp=a[s]; while(i!=j){//交替扫描 while(j>i && a[j]>tmp) --j; if(i<j){ a[i]=a[j]; ++i; } while(i<j && a[i]<tmp) ++i; if(i<j){ a[j]=a[i]; --j; } } a[i]=tmp; QuickSort(a,s,i-1); QuickSort(a,i+1,t); } } //****归并排序****************************** //稳定,O(n*logn) void Merge(int a[],int low,int mid,int high){//实现一次归并 int *a1; int i=low,j=mid+1,k=0; a1=(int * )malloc((high-low+1)*sizeof(int )); while(i<=mid && j<=high){ if(a[i]<=a[j]){//第1段中的记录放到a1中 a1[k]=a[i]; ++i;++k; } else{//第2段中的记录放到a1中 a1[k]=a[j]; ++j;++k; } } while(i<=mid){//第1段余下部分复制到a1 a1[k]=a[i]; ++i;++k; } while(j<=high){//第2段余下部分复制到a1 a1[k]=a[j]; ++j;++k; } for(k=0,i=low;i<=high;++k,++i)//a1复制回a a[i]=a1[k]; } //实现一趟归并 void MergePass(int a[],int length,int n){ int i; for( i=0;i+2*length-1<n;i=i+2*length) Merge(a,i,i+length-1,i+2*length-1); if(i+length-1<n) Merge(a,i,i+length-1,n-1); } //二路归并 void MergeSort(int a[],int n){ for(int length=1;length<n;length=2*length) MergePass(a,length,n); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值