初學數據結構之排序

還在學習。學完再加



插入排序



void Insertion_Sort(int A[],int N)
{
	int p,Tmp,i;
	for(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 Bubble_Sort(int A[],int N)
{
	int i,p,flag,t;
	for(p=N-1;p>=0;p--)
	{
		flag=0;
		for(i=0;i<p;i++)
		{
			if(A[i]>A[i+1])
			{
				t=A[i];
				A[i]=A[i+1];
				A[i+1]=t;
				flag=1;
			}
		}
		if(flag==0)
		break;
	}		
}




原始希爾排序


void Shell_Sort(int A[],int N)
{
	int D,p,Tmp,i;
	for(D=N/2;D>0;D/=2)
	{
		for(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;			
		}
	}
}



希爾排序+Hibbard or Sedgewick


int Hibbard[6]={0,1,3,7,15,31}; //2^k-1
int Sedgewick[6]={0,1,5,19,41,109}; //9*4^i-9*2^i+1 or 4^i-3*2^i+1
 

void Shell_Sort(int A[],int N)
{
	int D,p,Tmp,i,k;
	for(k=6;k>0;k--) //
	{
		D=Hibbard[k];//
		for(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 Merge(int A[],int TmpA[],int L,int R,int RightEnd)
{
	int LeftEnd=R-1,NumElements=RightEnd-L+1,i;
	int Tmp=L;
	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(i=0;i<NumElements;i++,RightEnd--)
	A[RightEnd]=TmpA[RightEnd];
}
void MSort(int A[],int 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);
	}	
}
int Merge_Sort(int A[],int N)
{
	int *TmpA=new int[N];
	
	if(TmpA!=NULL)
	{
		MSort(A,TmpA,0,N-1);
		free(TmpA);
	}
	else
	{
		printf("空間不足");
		return 0;
	}
}




快速排序+插入排序
 
int Cutoff=100;
void Insertion_Sort(int A[],int N)
{
	int p,Tmp,i;
	for(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 Swap(int *a,int *b)
{
	int t;
	t=*a;
	*a=*b;
	*b=t;
}
int Median3(int 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];
} 
int Quicksort(int A[],int Left,int Right)
{
	if(Right==0)	//防止數組越界 
	return 0;
	if(Cutoff<=Right-Left)
	{
		int i,j,Pivot;
		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(int A[],int N)
{
	Quicksort(A,0,N-1);      
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章