排序函数(直接InsertSort,希尔ShellSort,选择SelectSort,快排QuickSort,堆排HeapSort,归并MergeSort)的实现(除基数排序)

排序函数(直接InsertSort,希尔ShellSort,选择SelectSort,快排QuickSort,堆排HeapSort,归并MergeSort)的实现(除基数排序),可以多点评论啊,有错火改

#include <iostream> 
using namespace std;

typedef int Elm;

struct node
{
	Elm data;//数据域 
	int key;//标志符 
};
//直接插入排序 
void InsertSort(node *E,int n)//稳定的排序 时间复杂度O(n^2) 
{
	int i,j;node r;
	for(i=1;i<n;i++)
	{
		j=i-1;//保证 j 在要当前目标数值的前面
		r=E[i];
		while(j>=0&&E[j].key>r.key)
		{
			E[j+1]=E[j];
			j--;
		} 
		E[j+1]=r;
	}		
}

//希尔排序
void ShellSort(node *E,int n)
{
	int i,j,flag;node r;
	flag=n/2;//分两组 
	while(flag>0)//以细分为判定标准 
	{
		for(i=flag;i<n;i++)
		{
			r=E[i];
			j=i-flag;
			while(j>=0&&r.key<E[j].key)
			{
				E[j+flag]=E[j];
				j=j-flag;
			}
			E[j+flag]=r;
		} 
		flag/=2;
	}
}

//冒泡排序_改良版 O(n^2)
void  BubbleSort(node *E,int n)
{
	int i,j;node r;
	bool f=false;//标识符,用来标记,当没有交换的时候就是排序完成的时候 
	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
		{
			if(E[j].key<E[i-1].key)
			{
				r=E[j];
				E[j]=E[j-1];
				E[j-1]=r;
				f=true; 
			}
			if(f==false) return ;
		}
	}
}

//快速排序 O(log_2n) 
void QuickSort(node *E ,int s,int t)
{
	int i=s,j=t;
	node r;
	if(s<t)
	{
		r=E[s];//把这区间的第一元素给 r ,让 r 成为基准 
		while(i!=j)
		{
			while(j>i&&E[j].key>=r.key) j--;//从后面往前面遍历,直到找到比头 标准r 小的 
			E[i]=E[j];
			while(i<j&&E[i].key<r.key) i++; //从前面往前面遍历,直到找到比头 标准r 大的
			E[j]=E[i]; 
		}
		E[i]=r;
		QuickSort(E,s,i-1);//对左区间递归排序
		QuickSort(E,i+1,t); //对右区间递归排序
	}
} 

//选择排序 O(n^2)
void SelectSort(node *E,int n)
{
	int i,j,k;  node temp;
   for (i=0;i<n-1;i++)   //做第i趟排序
   {  	
   		k=i;
		for (j=i+1;j<n;j++)  //在[i..n-1]中选key最小的R[k] 
	   	if (E[j].key<E[k].key)
	    	k=j;           //k记下的最小关键字所在的位置
		if (k!=i)          //交换R[i]和R[k] 
		{
	  		temp=E[i];  
			E[i]=E[k];  
			E[k]=temp;  
		}
   }
} 

//堆排序 O(nlog_2n)   特别声明,数组开始从1开始,非0开始,否则代码实现会出错
void sift(node* E,int low,int high) //调整堆的算法 
{  
	int i=low,j=2*i;    //E[j]是E[i]的左孩子
   	node temp=E[i];
   	while (j<=high)
   	{
		if (j<high && E[j].key<E[j+1].key)  j++;//比较两个孩子,标记数值大的下标 
        if (temp.key<E[j].key)
        {  
			E[i]=E[j]; //将E[j]调整到双亲结点位置上
	     	i=j;       //修改i和j值,以便继续向下筛选
   	     	j=2*i;
		}
		else break;   
    }
   E[i]=temp;
}

void HeapSort(node* E,int n)
{  
	int i; node temp;
   for (i=n/2;i>=1;i--) //循环建立初始堆
      sift(E,i,n); 
   for (i=n;i>=2;i--)  //进行n-1次循环,完成推排序
   {  
   		temp=E[1];       //将第一个元素同当前区间内E[1]对换
      	E[1]=E[i];
		E[i]=temp;
      	sift(E,1,i-1);   //筛选E[1]结点,得到i-1个结点的堆
   }
}

//归并排序 O(nlog_2n)
void Merge(node *R,int low,int mid,int high) 
{  node *R1;
   int i=low,j=mid+1,k=0; 
              //k是R1的下标,i、j分别为第1、2段的下标
   R1=new node[high-low+1];
   while (i<=mid && j<=high) 
     if (R[i].key<=R[j].key)  //将第1段中的记录放入R1中
     {  R1[k]=R[i];  i++;k++;   }
     else    				//将第2段中的记录放入R1中
     {  R1[k]=R[j];  j++;k++;   }   
	while (i<=mid)         //将第1段余下部分复制到R1
		{  R1[k]=R[i];  i++;k++;   }
    while (j<=high)        //将第2段余下部分复制到R1
		{  	R1[k]=R[j];  j++;k++;  }
      		for (k=0,i=low;i<=high;k++,i++) //将R1复制回R中
         		R[i]=R1[k];
     delete []R1;
} 

void MergePass(node *R,int length,int n)
{  int i;
   for (i=0;i+2*length-1<n;i=i+2*length) 
                    //归并length长的两相邻子表 	
      Merge(R,i,i+length-1,i+2*length-1);
   if (i+length-1<n) //余下两个子表,后者长度小于length
	 Merge(R,i,i+length-1,n-1);  	//归并这两个子表
}

void MergeSort(node *R,int n)	
{  int length;
   for (length=1;length<n;length=2*length)
    	MergePass(R,length,n);
}


 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值