常用排序算法实现(C++)

/*排序算法*/
#include<iostream>
using namespace std;

/*交换函数*/
void swap(int &a,int &b){
	int temp=a;
	a=b;
	b=temp;
}

/*冒泡排序*/
void BubbleSort(int* a ,int length)
{
	int i,j;
	for(i=0;i<length-1;++i)
	{
		for(j=length-1;j>i;--j)
		{
			if(a[j]<a[j-1])
			{
				swap(a[j-1],a[j]);
			}
		}
	}
}

/*选择排序*/
void SelectSort(int *a,int length)
{
	int i,j;
	int tmpindex;
	for(i=0;i<length-1;++i)
	{
		tmpindex=i;
		for(j=i+1;j<length;++j){
			if(a[j]<a[tmpindex]){
				tmpindex=j;
			}
		}
		if(tmpindex!=i)
		{
			swap(a[i],a[tmpindex]);
		}
	}
}

/*插入排序*/
void InsertSort(int* a,int length)
{
	int i,j;
	for(i=1;i<length;++i)
	{
		int tmp=a[i];
		for(j=i-1;j>=0;--j)
		{
			if(a[j]>tmp){
				a[j+1]=a[j];	//后移
			}
			else
				break;
		}
		a[j+1]=tmp;
	}
}

/*希尔排序,特殊方式的插入排序*/
void shellSort(int* a,int length)
{
	int i,j;
	int d=length/2;	//设置步长
	do{
		for(i=d;i<length;++i)
		{
			//内部是一个简单插入排序
			int tmp=a[i];
			for(j=i-d;j>=0;j-=d)
			{
				if(a[j]>tmp)
				{
					a[j+d]=a[j];
				}else
				{
					break;
				}
			}
			a[j+d]=tmp;
		}
		d/=2;
	}while(d>0);
}

/*堆排序,主要是构建堆的过程*/
void AdjustMAXHeap(int* a,int pos,int length)
{
	int temp,child;
	for(temp=a[pos];2*pos+1<=length;pos=child)
	{
		child=2*pos+1;
		if(child+1<=length&&a[child+1]>a[child]) //找左右孩子中最大的那一个
				child++;
		if(a[child]>temp)
				a[pos]=a[child];
		else
				break;
	}
	a[pos]=temp;
}

void MAXHeapSort(int* a,int length)
{
	int i;
	for(i=length/2-1;i>=0;--i){
		AdjustMAXHeap(a,i,length-1);
	}
	for(i=length-1;i>0;--i)
	{
		swap(a[0],a[i]);
		AdjustMAXHeap(a,0,i-1);
	}
}

/*归并排序*/
/*合并相邻位置的两段*/
void Merge(int* a,int p,int q,int r)
{
	int i,j,k,n1,n2;
	n1=q-p+1;
	n2=r-q;
	int L[n1];
	int R[n2];
	for(i=0,k=p;i<n1;++i,++k)
			L[i]=a[k];
	for(i=0,k=q+1;i<n2;++i,++k)
			R[i]=a[k];
	for(k=p,i=0,j=0;i<n1&&j<n2;++k)
	{
		if(L[i]<R[j])
		{
			a[k]=L[i];
			++i;
		}
		else
		{
			a[k]=R[j];
			++j;
		}
	}
	if(i<n1)
	{
		for(j=i;j<n1;++j,++k)
				a[k]=L[j];
	}
	if(j<n2)
	{
		for(i=j;i<n2;++k,++i)
		{
			a[k]=R[i];
		}
	}
}

void MergeSort(int* a,int p, int r)
{
	if(p<r)
	{
		int q=(p+r)/2;
		MergeSort(a,p,q);
		MergeSort(a,q+1,r);
		Merge(a,p,q,r);
	}
}

/*快速排序,一分为二的思想*/
//找到对应的枢纽位置
int Partition(int* a,int low, int high)
{
	int privotkey=a[low];
	int tmp=low;
	while(low<high)
	{
		while(low<high&&a[high]>privotkey)
				--high;
		swap(a[tmp],a[high]);
		tmp=high;
		while(low<high&&a[low]<privotkey)
				++low;
		swap(a[tmp],a[low]);
		tmp=low;
	}
	return tmp;
}

void quickSort(int* a,int low, int high)
{
	if(low>=high) return;
	int index;	
	index=Partition(a,low,high);
	quickSort(a,low,index-1);
	quickSort(a,index+1,high);
}

int main(){
	int a[]={5,7,8,9,2,1,-3,6};
	int n=sizeof(a)/sizeof(int);
	for(int i=0;i<n;++i){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	//BubbleSort(a,n);
	//SelectSort(a,n);
	//InsertSort(a,n);
	//shellSort(a,n);
	//MAXHeapSort(a,n);
	//MergeSort(a,0,n-1);
	quickSort(a,0,n-1);
	for(int i=0;i<n;++i){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
}

你可能感兴趣的:(常用排序算法实现(C++))