几种常见排序算法实现

#include<iostream>
#include<time.h>
#include<windows.h>
#pragma comment(linker,"/subsystem:console")
using namespace std;
const int size=50000;
#pragma once
# define  rr 100000;
void InsertSort(int r[],int n)//插入排序
{
	 LARGE_INTEGER nFreq;
     LARGE_INTEGER nBeginTime;
     LARGE_INTEGER nEndTime;
     double time;
     QueryPerformanceFrequency(&nFreq);
     QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
	int num1=0,num2=0;//记录移动次数和比较次数的参数
	for(int i=2;i<=n;i++)
	{
		int j;
		r[0]=r[i];//用哨兵记录待排序的数据
		for( j=i-1;r[0]<r[j];j--,num1++)
		{
			r[j+1]=r[j];
			num2=num2+3;
		}
		num1++;
		r[j+1]=r[0];//把数据放入合适的位置
		
	}
	QueryPerformanceCounter(&nEndTime);
    time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
	cout<<"排序后的数组为:";
	for(int k=1;k<=n;k++)
		cout<<r[k]<<"  ";
	cout<<endl;
	cout<<"比较次数为:"<<num1<<endl;
	cout<<"移动次数为:"<<num2<<endl;
    cout<<"执行时间: "<<time<<"uS"<<endl;
}
void ShellInsert(int r[],int n)//希尔排序
{
	 LARGE_INTEGER nFreq;
     LARGE_INTEGER nBeginTime;
     LARGE_INTEGER nEndTime;
     double time;
     QueryPerformanceFrequency(&nFreq);
     QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
	int j;int num1=0,num2=0;
	for(int d=n/2;d>=1;d=d/2)//增量每次减少一半,最后增量为1
	{
		for(int i=d+1;i<=n;i++)//相隔d的元素进行比较
		{
			if(r[i]<r[i-d])
			{
				r[0]=r[i];
				for( j=i-d;j>0&&r[0]<r[j];j=j-d,num1++)
				{
					r[j+d]=r[j];
					num2=num2+3;
				}
				r[j+d]=r[0];
			}
			num1++;
		}
	}
	 QueryPerformanceCounter(&nEndTime);
     time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
	cout<<"排序后的数组为:";
	for(int k=1;k<=n;k++)
		cout<<r[k]<<"  ";
	cout<<endl;
	cout<<"比较次数为:"<<num1<<endl;
	cout<<"移动次数为:"<<num2<<endl;
	cout<<"执行时间: "<<time<<"uS"<<endl;
}
void BubbleSort(int r[],int n)//冒泡排序
{
	 LARGE_INTEGER nFreq;
     LARGE_INTEGER nBeginTime;
     LARGE_INTEGER nEndTime;
     double time;
     QueryPerformanceFrequency(&nFreq);
     QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
	int pos=n;//pos记录最后一次比较的位置
	int num1=0,num2=0;
	while(pos!=0)
	{
		int bound=pos;
		pos=0;
		for(int i=1;i<bound;i++)
		{
			num1++;
			if(r[i]>r[i+1])
		   {
			   r[0]=r[i];r[i]=r[i+1];r[i+1]=r[0];
			   pos=i;num2=num2+3;
		   }
		}
	}
	QueryPerformanceCounter(&nEndTime);
    time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
	cout<<"排序后的数组为:";
	for(int k=1;k<=n;k++)
		cout<<r[k]<<"  ";
	cout<<endl;
	cout<<"比较次数为:"<<num1<<endl;
	cout<<"移动次数为:"<<num2<<endl;
	cout<<"执行时间: "<<time<<"uS"<<endl;
}
int Partion(int r[],int first,int end,int &num1,int &num2)//快速排序
{
	int i=first;int j=end;
	int pivot=r[i];//记录轴值
	while(i<j)
	{
		while((i<j)&&(r[j]>=pivot))//从右往左找比轴值小的元素
		{j--;num1++;}
		r[i]=r[j];if(i!=j)num2=num2+3;
		while((i<j)&&(r[i]<=pivot)&&num1++)//从左往右找比轴值大的元素
			i++;
		r[j]=r[i];if(i!=j)num2=num2+3;
	}
	r[i]=pivot;
	return i;
}
void Qsort(int r[],int i,int j,int &num1,int &num2)//快速排序
{
	if(i<j)
	{
		int pivotloc=Partion(r,i,j,num1,num2);
		Qsort(r,i,pivotloc-1,num1,num2);
		Qsort(r,pivotloc+1,j,num1,num2);
	}
}
void SelectSort(int r[],int n)//简单选择排序
{
	 LARGE_INTEGER nFreq;
     LARGE_INTEGER nBeginTime;
     LARGE_INTEGER nEndTime;
     double time;
     QueryPerformanceFrequency(&nFreq);
     QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
	int num1=0,num2=0;
	for(int i=1;i<n;i++)
	{
		int index=i;//index记录最小值的位置
		for(int j=i+1;j<=n;j++,num1++)
			if(r[j]<r[index])
				index=j;
		if(index!=i)
		{
			num2=num2+3;
			r[0]=r[i];
			r[i]=r[index];
			r[index]=r[0];
		}
	}
	QueryPerformanceCounter(&nEndTime);
    time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
	cout<<"排序后的数组为:";
	for(int k=1;k<=n;k++)
		cout<<r[k]<<"  ";
	cout<<endl;
	cout<<"比较次数为:"<<num1<<endl;
	cout<<"移动次数为:"<<num2<<endl;
	cout<<"执行时间: "<<time<<"uS"<<endl;
}
void Sift(int r[],int k,int m,int &num1,int &num2)//希尔排序
{
	int i=k,j=2*i;
	while(j<=m)
	{
		num1++;
		if(j<m&&r[j]>r[j+1])
			j++;//找到左右孩子中较小者
		if(r[i]<r[j]){break;}
		else
		{
			num2=num2+3;
		    int num=r[i];
			r[i]=r[j];
			r[j]=num;
			i=j;
			j=2*i;
		}
	}
}
void HeapSort(int r[],int n)//堆排序
{
	 LARGE_INTEGER nFreq;
     LARGE_INTEGER nBeginTime;
     LARGE_INTEGER nEndTime;
     double time;
     QueryPerformanceFrequency(&nFreq);
     QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
	int num1=0,num2=0;
	for(int i=n/2;i>=1;i--)
		Sift(r,i,n,num1,num2);//建立小根堆
	for(int j=1;j<n;j++)//每次输出堆顶元素再建堆
	{
		num2=num2+3;
		int num=r[1];
		r[1]=r[n-j+1];
		r[n-j+1]=num;
		Sift(r,1,n-j,num1,num2);
	}
    QueryPerformanceCounter(&nEndTime);
    time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
	cout<<"排序后的数组为:";
	for(int k=n;k>=1;k--)
		cout<<r[k]<<"  ";
	cout<<endl;
	cout<<"比较次数为:"<<num1<<endl;
	cout<<"移动次数为:"<<num2<<endl;
	cout<<"执行时间: "<<time<<"uS"<<endl;
}
void Merge(int r[],int r1[],int s,int m,int t,int &num1)
{
	int i=s;
	int j=m+1;
	int k=s;
	while(i<=m&&j<=t)
	{
		num1++;
		if(r[i]<r[j])
			r1[k++]=r[i++];//i和j中较小中进入r1数组
		else
			r1[k++]=r[j++];
	}
	if(i<=m)//没有排完部分继续存入数组r1后
		while(i<=m) r1[k++]=r[i++];
	if(j<=t)
		while(j<=t) r1[k++]=r[j++];
}
void MergePass(int r[],int r1[],int n,int h,int &num1)
{
	int i=1;
	while(i<=n-2*h-1)
	{
		Merge(r,r1,i,i+h-1,i+2*h-1,num1);
		i+=2*h;
	}
	if(i<n-h+1)
		Merge(r,r1,i,i+h-1,n,num1);//剩下两个序列中其中一个个数小于h
	else//只剩下一个序列时直接存入
		for(;i<=n;i++)
			r1[i]=r[i];
}
void MergeSort(int r[],int r1[],int n)//合并排序
{
	 LARGE_INTEGER nFreq;
     LARGE_INTEGER nBeginTime;
     LARGE_INTEGER nEndTime;
     double time;
     QueryPerformanceFrequency(&nFreq);
     QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
	int num1=0;
	int h=1;
	while(h<n)
	{
		MergePass(r,r1,n,h,num1);
		h=h*2;//h每次倍增
		for(int i=1;i<=n;i++)
			r[i]=r1[i];
	}
	QueryPerformanceCounter(&nEndTime);
    time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
	cout<<"排序后的数组为:";
	for(int k=1;k<=n;k++)
		cout<<r[k]<<"  ";
	cout<<endl;
	cout<<"比较次数为:"<<num1<<endl;
	cout<<"移动次数为:"<<0<<endl;
	cout<<"执行时间: "<<time<<"uS"<<endl;
}

void menu(int r[],int n)
{
	int b[100];int x;
	int d[11];
	for(int e=1;e<=10;e++)
		d[e]=r[e];
	system("cls");
    cout<<"\t\t---------------------------菜单-----------------------------|\n";
	cout<<"\t\t------------------------------------------------------------|\n";
	cout<<"\t\t|                                                           |\n";
	cout<<"\t\t|☆☆☆☆☆              主菜单                   ☆☆☆☆☆|\n";
	cout<<"\t\t|☆☆☆☆☆  1.   插入排序                        ☆☆☆☆☆|\n";
	cout<<"\t\t|☆☆☆☆☆  2.   希尔排序                        ☆☆☆☆☆|\n";
	cout<<"\t\t|☆☆☆☆☆  3.   冒泡排序                        ☆☆☆☆☆|\n";
	cout<<"\t\t|☆☆☆☆☆  4.   快速排序                        ☆☆☆☆☆|\n";
	cout<<"\t\t|☆☆☆☆☆  5.   简单选择排序                    ☆☆☆☆☆|\n";
	cout<<"\t\t|☆☆☆☆☆  6.   堆排序                          ☆☆☆☆☆|\n";
	cout<<"\t\t|☆☆☆☆☆  7.   归并排序                        ☆☆☆☆☆|\n";
	cout<<"\t\t|☆☆☆☆☆  8.   退出                            ☆☆☆☆☆|\n";
	cout<<"\t\t-------------------------------------------------------------\n";

	cout<<"\t\t请输入你的选择:";
	while(true)
	{
    cin>>x;
	if(!(x>=1&&x<=8))
	{
		cout<<"请你重新输入你的选择:";
		continue;
	}
	else break;
	}
	int num1=0,num2=0;
	switch(x)
	{
	case 1:
		{	system("cls");
		InsertSort(r,n);
		cout<<"返回上一层请按1:";
		int a1;
		cin>>a1;
		if(a1==1)
			menu(d,n);
		break;}
	case 2:
	{	system("cls");
		ShellInsert(r,n);
		cout<<"返回上一层请按1:";
		int a2;
		cin>>a2;
		if(a2==1)
			menu(d,n);
		break;}
	case 3:
	{		system("cls");
        BubbleSort(r,n);
		cout<<"返回上一层请按1:";
		int a3;
		cin>>a3;
		if(a3==1)
			menu(d,n);
		break;}
	case 4:
		{	system("cls");
	    LARGE_INTEGER nFreq;
        LARGE_INTEGER nBeginTime;
        LARGE_INTEGER nEndTime;
        double time;
        QueryPerformanceFrequency(&nFreq);
        QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
	    Qsort(r,1,n,num1,num2);
		QueryPerformanceCounter(&nEndTime);
        time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
		cout<<"排序后的数组为:";
	    for(int k=1;k<=n;k++)
		    cout<<r[k]<<"  ";
	    cout<<endl;
		cout<<"比较次数为:"<<num1<<endl;
	    cout<<"移动次数为:"<<num2<<endl;
		cout<<"执行时间: "<<time<<"uS"<<endl;
		cout<<"返回上一层请按1:";
		int a4;
		cin>>a4;
		if(a4==1)
			menu(d,n);
		break;}
	 case 5:
		 {system("cls");
        SelectSort(r,n);
		cout<<"返回上一层请按1:";
		int a5;
		cin>>a5;
		if(a5==1)
			menu(d,n);
		break;}
	  case 6:
		  {	system("cls");
        HeapSort(r,n);
		cout<<"返回上一层请按1:";
		int a6;
		cin>>a6;
		if(a6==1)
			menu(d,n);
		break;}
	  case 7:
		  {	system("cls");
        MergeSort(r,b,n);
		cout<<"返回上一层请按1:";
		int a7;
		cin>>a7;
		if(a7==1)
			menu(d,n);
		break;}
	  case 8:break;
	}
}
void put(int m)
{  
	switch(m)
	{
	case 1:
		{
	      cout<<"要进行几个数的排序:";
	      int n;
	      cin>>n;
	      int *a=new int [n+1];
	      cout<<"请输入需要排序的"<<n<<"个数:";
	      for(int k=1;k<=n;k++)
	   {
          cin>>a[k];
	    }
	    menu(a,n);
	   delete []a;
	     break;
		}
	 case 2:
		{ 
			
		    cout<<"将产生"<<size<<"个随机数"<<endl;
		    int *b=new int  [size+1];
		    for( int i=1;i<=size;i++)
			    b[i]=rand()% rr;
		     menu(b,size);
		    delete []b;
		    break;
		}
	
}
}
int main()
{
	 int c;
	cout<<"键盘输入数据-1"<<endl;
	cout<<"产生随机数-2"<<endl;
	cin>>c;
	if(c!=1&&c!=2)
	{
		cout<<"键盘输入数据-1"<<endl;
	    cout<<"产生随机数-2"<<endl;
		cin>>c;
	}
	put(c);
	return 0;

}

供大家学习
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值