您的位置:首页 > 其它

插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序

2014-07-21 10:12 941 查看
#include<iostream>
#include<vector>
using namespace std;
void print(int a[],int n);

void InsertSort(int a[],int n)
{
	for(int i=1;i<n;++i)
	{
		int tmp=a[i];
		int j=i-1;
		while(j>=0 && a[j]>tmp)
		{
			a[j+1]=a[j];
			--j;
		}
		a[j+1]=tmp;
	}
}
void BinInsertSort(int a[],int n)
{
	int high;
	int low;
	int mid;
	for(int i=1;i<n;++i)
	{
		int tmp=a[i];
		high=i-1;
		low=0;
		
		while(low<=high)
		{
			mid=(low+high)/2;
			if(tmp<=a[mid])
				high=mid-1;
			else
				low=mid+1;
		}
		for(int j=i-1;j>=low;j--)
			a[j+1]=a[j];
		a[low]=tmp;
	}
}
void ShellSort(int a[],int n)
{
	int d=n/2;
	while(d>0)
	{
		for(int i=0;i<d;++i)
		{
			for(int j=i+1;j<n;j=j+d)
			{
				//分成d组,组内使用插入排序
				int tmp=a[j];
				int k=j-1;
				while(k>=i && a[k]>tmp)
				{
					a[k+1]=a[k];
					--k;
				}
				a[k+1]=tmp;
			}
		}
		d=d/2;
	}
	
}
void SelectSort(int a[],int n)
{
	for(int i=0;i<n-1;++i)
	{
		bool change=false;
		int min=i;
		for(int j=n-1;j>i;--j)
		{
			if(a[j]<a[min])
			{
				change=true;
				min=j;
			}
		}
		if(min!=i)
		{
			int tmp=a[i];
			a[i]=a[min];
			a[min]=tmp;
			
		}
		if(!change)
		{
			//本次没有交换,已经排好序
			return;
		}
	}
}
void BubbleSort(int a[],int n)
{
	for(int i=0;i<n;++i)
	{
		bool change=false;
		for(int j=n-1;j>i;--j)
		{
			if(a[j-1]>a[j])
			{
				int tmp=a[j];
				a[j]=a[j-1];
				a[j-1]=tmp;
				change=true;
			}
		}
		if(!change)
			return ;
	}
}

void CocktailSort(int a[],int n)
{
	int tail=n-1;
	for(int i=0;i<=tail;++i)
	{
		bool change=false;
		for(int j=tail;j>i;--j)
		{
			if(a[j-1]>a[j])
			{
				int tmp=a[j];
				a[j]=a[j-1];
				a[j-1]=tmp;
				change=true;
			}
		}
		if(!change)
			return;
		++i;
		for(int j=i;j<tail;++j)
		{
			if(a[j]>a[j+1])
			{
				int tmp=a[j];
				a[j]=a[j+1];
				a[j+1]=tmp;
				change=true;
			}
		}
		if(!change)
			return;
		--tail;
	}
}

int Partion(int a[],int p,int r)
{
	//p为划分的起始位置,r为划分的结束位置,以a[r]为基准元
	int i=p-1;//p-i为小于基准区间
	for(int j=p;j<r;++j)
	{
		if(a[j]<a[r])
		{
			++i;
			if(i!=j)
			{
				int tmp=a[i];
				a[i]=a[j];
				a[j]=tmp;
			}
			
		}
	}
	++i;
	int tmp=a[i];
	a[i]=a[r];
	a[r]=tmp;
	return i;
}
void QuickSOrt(int a[],int p,int r)
{
	if(p<r)
	{
		int q=Partion(a,p,r);
		QuickSOrt(a,p,q-1);
		QuickSOrt(a,q+1,r);
	}
}
void QuickSort(int a[],int n)
{
	QuickSOrt(a,0,n-1);
}

int getRightChild(const int i)
{
	return 2*(i+1);
}
int getLeftChild(const int i)
{
	return 2*(i+1)-1;
}

void HeapAdjust(int a[],int n,int root)
{
	int max=root;
	int lcvalue=getLeftChild(root);
	if(lcvalue<n && a[lcvalue]>a[root])
	{
		max=lcvalue;
	}
	int rcvalue=getRightChild(root);
	if(rcvalue<n && a[rcvalue]>a[max])
	{
		max=rcvalue;
	}
	if(max!=root)
	{
		int tmp=a[root];
		a[root]=a[max];
		a[max]=tmp;
		HeapAdjust(a,n,max);
	}
}

void BuildHeap(int a[],int n)
{
	for(int i=n/2-1;i>=0;--i)
		HeapAdjust(a,n,i);
}
void HeapSort(int a[],int n)
{
	BuildHeap(a,n);
//	print(a,n);
	int j=n;
	while(j>0)
	{
		int tmp=a[0];
		a[0]=a[j-1];
		a[j-1]=tmp;
		--j;
		HeapAdjust(a,j,0);
	}
}

void MergeArrange(int a[],int first,int mid,int last,int tmp[])
{
	int i=first;
	int j=mid+1;
	int k=first;
	while(i<=mid && j<=last)
	{
		if(a[i]<a[j])
			tmp[k++]=a[i++];
		else
			tmp[k++]=a[j++];
	}
	while(i<=mid)
		tmp[k++]=a[i++];
	while(j<=last)
		tmp[k++]=a[j++];
	for(int ii=first;ii<=last;++ii)
		a[ii]=tmp[ii];
}
void MergeSort(int a[],int first,int last,int tmp[])
{
	if(first<last)
	{
		int mid=(first+last)/2;
		MergeSort(a,first,mid,tmp);
		MergeSort(a,mid+1,last,tmp);
		MergeArrange(a,first,mid,last,tmp);
	}
}

void MergeSort(int a[],int n)
{
	int *tmp=new int
;
	MergeSort(a,0,n-1,tmp);
	delete[] tmp;
}
void print(int a[],int n)
{
	for(int i=0;i<n;++i)
		cout<<a[i]<<' ';
	cout<<endl;
}
int main()
{
	const int n=10;
	int a
={9,12,17,30,50,20,60,65,4,49};
	//InsertSort(a,n);
	//BinInsertSort(a,n);
	//ShellSort(a,n);
	//SelectSort(a,n);
	//BubbleSort(a,n);
	//CocktailSort(a,n);
	//QuickSort(a,n);
	//HeapSort(a,n);
	MergeSort(a,n);
	print(a,n);
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐