码迷,mamicode.com
首页 > 编程语言 > 详细

各种排序方法汇总

时间:2016-05-12 16:06:07      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
void Swap(int &a,int &b) {int n;n=a,a=b,b=n;}
//--简单排序-- 
//冒泡排序
void  Bubble_Sort(ElementType A[],int N)
{
	int flag;
	for(int P=N-1;P>=0;P--)
	{
		flag=0;
		for(int i=0;i<P;i++)
		if(A[i]>A[i+1])
		{
			Swap(A[i],A[i+1]);
			flag=1;
		}
		if(!flag) break;
	}
}
//插入排序
void Insertion_Sort(ElementType A[],int N)
{
	int i,tmp;
	for(int P=1;P<N;P++)
	{
		tmp=A[P];
		for(i=P;i>0 && A[i-1]>tmp;i--)
			A[i]=A[i-1];
		A[i]=tmp;
	}
	
}
//希尔排序(插入排序的改进)//
void Shell_Sort(ElementType A[],int N)
{
	int i,tmp,D;
	for(D=N/2;D>0;D/=2)  //希尔增量序列 
	{
		for(int P=D;P<N;P++)
		{
			tmp=A[P];
			for(i=P;i>=D && A[i-D]>tmp;i-=D)
				A[i]=A[i-D];
			A[i]=tmp;
		}
	}
}
//堆排序
void Selection_Sort(ElementType A[],int N)
{
	int i,MinPosition;
	for(i=0;i<N;i++)
	{
		MinPosition = ScanForMin(A,i,N-1);
		/*从A[i]到A[N-1]找到最小元;用最小堆*/ 
		if(MinPosition!=i)
		Swap(A[i],A[MinPosition]);
	}
} 
void Heap_Sort(ElementType A[],int N) /*应用效果可能不如 	 */ 
{									/*	 Sedgewick的希尔序列*/ 
	int i;
/*	ElementType TmpA[N];
	Create(H);
	BuildMinHeap(H);
	for(i=0;i<N;i++)
		TmpA[i]=DeleteMin(H);
	for(i=0;i<N;i++)
		A[i]=TmpA[i]; */
	for(i=N/2;i>=0;i--) //BuildMinHeap
		PercDown(A,i,N);
	for(i=N-1;i>0;i--)
	{
		Swap(A[0],A[i]); //DeleteMax
		PercDown(A,0,i);
	}
}
//归并排序///////////////////////////////// ////////////// 
//////////////////////////////////////// ///////////////// 
/*核心:有序子列的归并;*/
void Merge(ElementType A[],ElementType TmpA[],
						int L,int R,int RightEnd)
{
	int LeftEnd,Tmp,NumElements;
	LeftEnd = R-1;
	Tmp = L;
	NumElements = RightEnd - L + 1;
	while(L<=LeftEnd && R<=RightEnd)
	{
		if(A[L] <= A[R]) TmpA[Tmp++]=A[L++];
		else             TmpA[Tmp++]=A[R++];
	}
	while(L<=LeftEnd)  TmpA[Tmp++]=A[L++];
	while(R<=RightEnd) TmpA[Tmp++]=A[R++];
	for(int i = 0;i < NumElements ; i++, RightEnd--)
	A[RightEnd]=TmpA[RightEnd];
}

//递归算法,分割成小块 //////////////////////////////
void MSort(ElementType A[],ElementType TmpA[],
						int L,int RightEnd)
{
	int Center;
	if(L < RightEnd)
	{
		Center=(L + RightEnd) / 2;
		MSort(A,TmpA,L,Center);
		MSort(A,TmpA,Center+1,RightEnd);
		Merge(A,TmpA,L,Center+1,RightEnd);
	}
}

void Merge_Sort(ElementType A[],int N) 
{
	ElementType *TmpA;
	TmpA = (ElementType *)malloc(N*sizeof(ElementType));
	if(TmpA!=NULL)
	{
		MSort(A,TmpA,0,N-1);
		free(TmpA);
	}
	else Error("空间不足"); 
}

//非递归算法////////////////////////////////////////
void Merge_pass(ElementType A[],ElementType TmpA[],
						int N,int length) //length = 当前有序子列长度
{
	int i;
	for(i=0;i <= N-2*length;i+=2*length)
	Merge1(A,TmpA,i,i+length,N-1);
	if(i+length<N)
	Merge1(A,TmpA,i,i+length,N-1);
	else
	 for(int j = 1;j<N;j++) TmpA[j] = A[j]; 
}

void Merge_Sort(ElementType A[],int N) 
{
	int length = 1;
	ElementType *TmpA;
	TmpA = (ElementType*)malloc(N*sizeof(ElementType));
	if(TmpA!=NULL )
	{
		while(length < N)
		{
			Merge_pass(A,TmpA,N,length);
			length*=2;
			Merge_pass(TmpA,A,N,length);
			length*=2;
		}
		free(TmpA);
	}
	else Error("空间不足"); 
}

 void Merge1(ElementType A[],ElementType TmpA[],
						int L,int R,int RightEnd)
{
	int LeftEnd,Tmp,NumElements;
	LeftEnd = R-1;
	Tmp = L;
	NumElements = RightEnd - L + 1;
	while(L<=LeftEnd && R<=RightEnd)
	{
		if(A[L] <= A[R]) TmpA[Tmp++]=A[L++];
		else             TmpA[Tmp++]=A[R++];
	}
	while(L<=LeftEnd) TmpA[Tmp++]=A[L++];
	while(R<=RightEnd) TmpA[Tmp++]=A[R++];
//	for(int i = 0;i < NumElements ; i++, RightEnd--)
//	A[RightEnd]=TmpA[RightEnd];
}

////////快速排序////////////////////////////////////////
//核心:选主元 (头,尾,中,三者选中间大小的数字) 
ElementType Median3(ElementType A[],int Left,int Right)
{
	int Center = (Left + Right) / 2;
	if(A[Left] > A[Center])
		Swap(A[Left] , A[Center]);
	if(A[Left] > A[Right])
		Swap(A[Left] , A[Right]);
	if(A[Center] > A[Right])
		Swap(A[Center] , A[Right]);
	Swap(A[Center] , A[Right-1]);
	return A[Right-1];
} 
/*Left保存最小值,Right保存最大值,Right-1保存中值,
	只需要考虑(left+1,Right-2)的排序就好*/ 
void Quicksort(ElementType A[], int Left, int Right)
{
	int i,j,Pivot;
	if(Cutoff <= Right-Left)  //当排序的数小于Cutoff就用插入排序,因为数量小的时候,快排还不如插入排序; 
	{
		Pivot = Median3(A,Left,Right);
		i = Left; j = Right - 1;
		for(;;)
		{
			while(A[++i] < Pivot);
			while(A[--j] > Pivot);
			if(i<j) Swap(A[i],A[j]);
			else break;
		}
		Swap(A[i],A[Right-1]);
		Quicksort(A,Left,i-1);
		Quicksort(A,i+1,Right);
	}
	else 
		Insertion_Sort(A+Left,Right-Left+1);	
 } 

void Quick_Sort(ElementType A[],int N)
{
	Quicksort(A,0,N-1);
}

各种排序方法汇总

标签:

原文地址:http://blog.csdn.net/qq_34446253/article/details/51365873

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!