还在学习。学完再加
插入排序
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);
}