⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 内部排序.cpp

📁 数据结构课程设计
💻 CPP
字号:
#include<iostream.h>
#include <stdio.h>
#include<windows.h>
#define MAX 1000
int jj,n[6]={0,0},c[6]={0,0}; 
class paixu
{
  public:
	    void XuanzePaixu();//简单选择排序
		void MaopaoPaixu();//冒泡排序
		void CharuPaixu();//直接插入排序
		//快速排序
		int  Huafen(int l,int h);
		void KPaixu(int l,int h);
		void KuaisuPaixu();
		//堆排序
		void dui(int s,int m);
		void DuiPaixu();
		
		void XierPaixu();//希尔排序
		void suijishu(int y);//产生随机数
  private:
	  int RA1[MAX],RA2[MAX];
};

//==============================================================================
//简单选择排序
void paixu::XuanzePaixu() 
{
	int v;
	for(int i=1;i <= jj;i++)
	{RA2[i] = RA1[i];n[0]++;}
	for( i = 1 ; i < jj ; ++i)
	{
		int j = i;
		for(int k = i+1 ; k <= jj ; k++)
		{	if(RA2[k] < RA2[j]) j = k;c[0]++;}
			if(i != j)
			{	v = RA2[j];	
			    RA2[j] = RA2[i]; 
			    RA2[i] = v; 
				n[0]++;
			} 
    
	} cout<<"排序后的元素为:"<<endl;
	 for( i=1;i <= jj;i++)
		 cout<<RA2[i]<<"  ";
	 cout<<endl;
	 cout<<"比较次数为:"<<c[0];
	 cout<<"移动次数为:"<<n[0];
} 
//==============================================================================
//起泡排序
void paixu::MaopaoPaixu()
{
	int k=jj;
	int w;
	for(int i=1;i <= jj;i++)
	{RA2[i] = RA1[i];n[1]++;}
	while(k>1)
	{
	int	Index=1;
		for(int j=1;j<k;j++)
		{
			if(RA2[j+1]<RA2[j])
			{
			  w=RA2[j];
			  RA2[j]=RA2[j+1];
			  RA2[j+1]=w;      //互换记录
			  Index=j;
			  n[1]++;
			} 
			c[1]++;
		}k=Index;
	}
	 cout<<"排序后的元素为:"<<endl;
	 for( i=1;i <= jj;i++)
		 cout<<RA2[i]<<"  ";
	 cout<<endl;
	 cout<<"比较次数为:"<<c[1];
	 cout<<"移动次数为:"<<n[1];
	 
}
//==============================================================================
//直接插入排序
void paixu::CharuPaixu()
{
    
	for(int i=1;i <= jj;i++)
	{RA2[i] = RA1[i];}
	for(i=2;i<=jj;++i)
	   if(RA2[i]<RA2[i-1])
	   {
	    RA2[0]=RA2[i];  //复制为哨兵
		for(int j=i-1;RA2[0]<RA2[j];--j)
		{RA2[j+1]=RA2[j]; n[2]++;c[2]++;}//记录后移
		    RA2[j+1]=RA2[0];  //插入到正确位置
		    n[2]++;
	   }
	        n[2]++;
			c[2]++;
     cout<<"排序后的元素为:"<<endl;
	 for( i=1;i <= jj;i++)
		 cout<<RA2[i]<<"  ";
	 cout<<endl;
	 cout<<"移动次数为:"<<c[2];
	 cout<<"一共移动次数为:"<<n[2];
}
//==============================================================================
//快速排序
int paixu::Huafen(int l,int h) //划分
{
	RA2[0] = RA2[l];    
	int pt = RA2[l];  //枢轴记录关键字
	while(l < h)         //从表的两端交替地向中间扫描
	{
		while(l < h && RA2[h] >= pt) {-- h;c[3]++;}
		RA2[l] = RA2[h];c[3]++;n[3]++;    //将比枢轴记录小的记录移到底端
		while (l < h && RA2[l] <= pt) {++ l;c[3]++;}
		RA2[h] = RA2[l];n[3]++;c[3]++;   //将比枢轴记录大的记录移到高端
	}// while
	RA2[l] = RA2[0];     //枢轴记录移到正确位置
	n[3]++;
	return l;        //返回枢轴的位置
} //Huafen
void paixu::KPaixu(int l,int h)
{
	if(l < h)   //长度大于1
	{
		int pivotloc = Huafen(l,h); 
	    KPaixu(l,pivotloc-1);   //对底端子序列递归排序
		KPaixu(pivotloc+1,h);   //对高断子序列递归排序
	} //if
}// KuaisuPaixu
void paixu::KuaisuPaixu() //快速排序
{   
	for(int i=1;i <= jj;i++)
	{RA2[i] = RA1[i];}
	KPaixu(1,jj);
	cout<<"排序后的元素为:"<<endl;
	 for(i=1;i <= jj;i++)
		 cout<<RA2[i]<<"  ";
	 cout<<endl;
	 cout<<"比较次数为:"<<c[3]<<"      ";
	 cout<<"移动次数为:"<<n[3];
} //KuaisuPaixu
//==============================================================================
//堆排序
void paixu::dui(int s,int m)
{   
	for(int i=1;i <= jj;i++)
	{RA2[i] = RA1[i];}
	int rc = RA2[s];       //暂存根结点的记录
	for(int j = 2*s;j<=m;j*=2)  //沿较大的孩子结点向下筛选
	{
		if(j<m&&RA2[j]<RA2[j+1])++j; c[4]++;
		if(RA2[s]>=RA2[j]){c[4]++;break;  }      //不需要调整
		RA2[s] = RA2[j];
		n[4]++;//把大于关键字记录往上调	
		s = j;
	}
	RA2[s] = rc;n[4]++;     //回移筛选小的记录
}
void paixu::DuiPaixu()
{
	int w;
	for(int i = jj/2;i>0;--i)  
		dui(i,jj);
	    w = RA2[1];
	   RA2[1] = RA2[jj];
	   RA2[jj] = w;
	//交换"堆顶"和"堆底"的记录
	for(i = jj-1;i>1;--i)
	{
		dui(1,i);   
		w = RA2[1];RA2[1] = RA2[i];RA2[i] = w; 
		//将堆顶记录和当前的"堆底"记录相互交换使已有序的记录堆移到底部
	}
	cout<<"排序后的元素为:"<<endl;
	 for( i=1;i <= jj;i++)
		 cout<<RA2[i]<<"  ";
	 cout<<endl;
	 cout<<"比较次数为:"<<c[4]<<"      ";
	 cout<<"移动次数为:"<<n[4];

}
//==============================================================================
//希尔排序

void paixu::XierPaixu()
{
	for(int i=1;i <= jj;i++)
	{RA2[i] = RA1[i];}
	int dt=5;
   	do
	{
		dt = dt/3+1;
	//1 前后记录位置的增量是dt,而不是1
	for(int i=dt+1;i<=jj;++i)
		if(RA2[i]<RA2[i-dt]){ c[5]++;         //需将RA2.[i]插入有序增量子表
		  RA2[0]=RA2[i];               //暂存在RA2.[0]
			n[5]++;
		  int j=i-dt;
			do
			{
				RA2[j+dt] = RA2[j];n[5]++;
				j = j - dt;
				c[5]++;
			}while(j > 0&&RA2[0] < RA2[j]); //记录后移,查找插入位置
			RA2[j+dt]=RA2[0];n[5]++;c[5]++; //插入
		}
	}while(dt > 1);
	cout<<"排序后的元素为:"<<endl;
	 for( i=1;i <= jj;i++)
		 cout<<RA2[i]<<"  ";
	 cout<<endl;
	 cout<<"比较次数为:"<<c[5]<<"      ";
	 cout<<"移动次数为:"<<n[5];

}//XierPaixu//一趟增量为dt[k]的插入排序
//==============================================================================
//随机生成函数
void paixu::suijishu(int y)
	  {
         int i;
         for(i=1;i<=y;i++)
         RA1[i]=(int)rand();
		 cout<<"随机产生的所有元素为:"<<endl;
		 for(i=1;i<=y;i++)
			 cout<<RA1[i]<<"   ";
		 cout<<endl;
	  }
void main()
{           
	paixu m;
cc:	system("cls");
	cout<<"     ◆◆◆◆内部排序算法比较程序◆◆◆◆"<<endl<<endl;
	cout<<"     ***********************************\t"<<endl;
	cout<<"     *\t         1、内部排序比较       *\t"<<endl;
	cout<<"     *\t         2、退出系统           *\t"<<endl;
	cout<<"     ***********************************\t"<<endl;
	char b;
dt:	cin>>b;
	if(b == '1')
	{
	system("cls");
	cout<<"------------------------------------------------"<<endl;
	cout<<"     \t         ⊙返回上页            \t"<<endl;
	cout<<"     \t         ①简单选择排序        \t"<<endl;
	cout<<"     \t         ②起泡排序            \t"<<endl;
	cout<<"     \t         ③直接插入排序        \t"<<endl;
	cout<<"     \t         ④快速排序            \t"<<endl;
	cout<<"     \t         ⑤堆排序              \t"<<endl;
	cout<<"     \t         ⑥希尔排序            \t"<<endl;
	cout<<"请输入要处理的1组随机数的总个数: ";
	int q;
	cin>>q;
	system("cls");
	if(q==0)
	goto cc;
	jj=q;
	m.suijishu(q);
	cout<<endl;
	while(1)
	{
	cout<<"------------------------------------------------"<<endl;
	cout<<"     \t         ⊙返回上页            \t"<<endl;
	cout<<"     \t         ①简单选择排序        \t"<<endl;
	cout<<"     \t         ②起泡排序            \t"<<endl;
	cout<<"     \t         ③直接插入排序        \t"<<endl;
	cout<<"     \t         ④快速排序            \t"<<endl;
	cout<<"     \t         ⑤堆排序              \t"<<endl;
	cout<<"     \t         ⑥希尔排序            \t"<<endl;
	char k;
	cout<<"请选择你要排序的方法:";
	cin>>k;
	switch(k) 
	{ 
		case '0':   
			        goto cc;
		case '1':
					m.XuanzePaixu();
				
					break; 
		case '2':
					m.MaopaoPaixu();
				
					break;
		case '3':    
					m.CharuPaixu();
				
					break; 
		case '4':
					m.KuaisuPaixu();
				
					break;
		case '5':   
					m.DuiPaixu();
				
					break;
		case '6':   
					m.XierPaixu();
				
					break;
		default:
					cout<<"输入信息错误!请重新输入!"<<endl;
					break;
	}//switch
	               	cout<<endl;
					cout<<"按任意键返回!"<<endl;
					getchar();
                    system("cls");
	} 
	}
	if(b == '2')
		  exit(0);
	else
		  cout<<"输入信息错误!请重新输入:"<<endl;
		  goto dt;
}

 

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -