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

📄 sortarithmetis.cpp

📁 学习数据结构写的排序代码
💻 CPP
字号:
// SortArithmetis.cpp: implementation of the CSortArithmetis class.
//
//////////////////////////////////////////////////////////////////////

#include "SortArithmetis.h"
#include "iostream.h"
#include "iomanip.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSortArithmetis::CSortArithmetis(int *val,int n)
{
	m_nCount=n;
    m_nArray=val;
	m_nNumber=0;
}


CSortArithmetis::~CSortArithmetis()
{

}


void CSortArithmetis::ShowArray()//显示排列好的数组
{
  	cout<<"*********************the sorting results******************* "<<endl;  
	cout<<"Elements number: "<<m_nCount<<endl;
	cout<<"Runing times: "<<m_nNumber<<endl;
	for(int i=0;i<m_nCount;i++)
		cout<<setw(5)<<m_nArray[i]; 
	cout<<endl;    
}


void CSortArithmetis::DirectInsert()//直接插入排序
{
	cout<<"直接插入排序:"<<endl;
	int i,j;
	int value;

	m_nNumber=0;
	for(i=1;i<m_nCount;i++)
	{
		value=m_nArray[i];//保留结点值
	    for(j=i-1;j>=0&&value<m_nArray[j];j--)//移动位置
		{
			m_nArray[j+1]=m_nArray[j];
			m_nNumber++;
		}
		m_nArray[j+1]=value;
/*		for(j=0;j<i&&value>m_nArray[j];j++)//寻找插入位置
		{
		}
		k=j;//保留插入位置
	    for(j=i;j>k;j--)//移动位置
			m_nArray[j]=m_nArray[j-1];
		m_nArray[k]=value;
*/
	}
}

void CSortArithmetis::Bubble()//冒泡排序
{
	cout<<"冒泡排序:"<<endl;
    int i,k;
	int value;

	m_nNumber=0;
	for(k=m_nCount;k>0;k--)//一趟排序将使一个结点处在合适的位置
		for(i=0;i<k-1;i++)
		{
			if(m_nArray[i]>m_nArray[i+1])//进行交换
			{
				value=m_nArray[i];
				m_nArray[i]=m_nArray[i+1];
				m_nArray[i+1]=value;
			}
			m_nNumber++;
		}
}
	

void CSortArithmetis::SimpleChoose()//简单选择排序
{
	cout<<"简单选择排序:"<<endl;
	int i,j,k;
	int min,value;

	m_nNumber=0;
	for(i=0;i<m_nCount-1;i++)
	{
		min=m_nArray[i];
		for(j=i+1;j<m_nCount;j++)//寻找最小者
		{
			if(min>m_nArray[j])
			{
				min=m_nArray[j];
				k=j;
			}
			m_nNumber++;
		}
		if(min<m_nArray[i])//交换位置
		{
			value=m_nArray[k];
			m_nArray[k]=m_nArray[i];
			m_nArray[i]=value; 
		}
//		ShowArray();
	}
}

void CSortArithmetis::ShellSort()//希尔排序
{
	int dec,i,j,k,value;//dec是每一趟的增量

	m_nNumber=0;
    for(dec=m_nCount/2;dec>0;dec/=2)//需要N趟排序
	{
		for(i=0;i<dec;i++)//获取间隔元素组成新数组
		{
			//对新数组直接插入排序
			for(j=i;j<m_nCount;j+=dec)//依次得到新数组元素
			{
				value=m_nArray[j];//保留结点值
	            for(k=j-dec;k>=i&&value<m_nArray[k];k-=dec)//移动位置
				{
					m_nArray[k+dec]=m_nArray[k];
					m_nNumber++;
				}
		        m_nArray[k+dec]=value;
			}

		}
	}
}


void CSortArithmetis::QuickSort()//快速排序
{
	int low,high;

	m_nNumber=0;
	low=0;
	high=m_nCount-1;
	Quick(low,high,m_nNumber);
}

void CSortArithmetis::Quick(int low,int high,int count)//快速排序的子函数
{
	int i,j,keyValue;

    if(low<high)
	{
		keyValue=m_nArray[low];
		i=low;
		j=high;
		while(i<j)
		{
			while(i<j&&m_nArray[j]>=keyValue)
			{
				j--;
				m_nNumber++;
			}
			if(i<j)
				m_nArray[i++]=m_nArray[j];
			while(i<j&&m_nArray[i]<=keyValue)
			{
				i++;
				m_nNumber++;
			}
			if(i<j)
				m_nArray[j--]=m_nArray[i];
            
		}
		m_nArray[i]=keyValue;//和数组最后一位交换
		Quick(low,i-1,count++);
		Quick(i+1,high,count++);
	}
}


void CSortArithmetis::HeapSort()
{
	for(int i=m_nCount;i>1;i--)
		Heap(1,i);
}

void CSortArithmetis::Heap(int start,int end)
{
	int i,j,l,r,n,val;

	n=end-start+1;
	for(i=(n-1)/2;i>=start;i--)
	{
//		for(j=i;j<=(n-1)/2;j=2*j)
		{
			l=2*i;//左子结点   
		    r=2*i+1;//右子结点
		    if(m_nArray[l-1]>m_nArray[i-1])//与左子结点进行比较
			{
			val=m_nArray[i-1];
			m_nArray[i-1]=m_nArray[l-1];
			m_nArray[l-1]=val;
			}
 	    	if(r<n&&m_nArray[r-1]>m_nArray[i-1])//与右子结点进行比较
			{
			val=m_nArray[i-1];
			m_nArray[i-1]=m_nArray[r-1];
			m_nArray[r-1]=val;
			}
	    	m_nNumber++;
//			ShowArray();
		}
	}
	if(m_nArray[0]>m_nArray[end-1])//将最大结点放在末尾
	{
		val=m_nArray[end-1];
		m_nArray[end-1]=m_nArray[0];
		m_nArray[0]=val;
	} 
}

⌨️ 快捷键说明

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