9.1 简单排序(冒泡,插入)
9.1.1 概述
后面介绍的所有排序算法,都默认为这样的格式:
9.1.2 冒泡排序
思路:从上到下比较相邻的元素,每次和下面那个元素作比较并交换。一共要完成N次排序。
C 语言实现
void Bubble_Sort(ElementType A[],
int N)
{
int p,i,flag;
for(p=N-
1;p>=
0;p--)
{
flag=
0;
for(i=
0;i<p;i++)
{
if(A[i]>A[i+
1])
{
Swap(A[i],A[i+
1]);
flag=
1;
}
}
if(flag==
0)
break;
}
}
9.1.3 插入排序
C 语言实现
void InsertionSort( ElementType A[],
int N )
{
int P, i;
ElementType Tmp;
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;
}
}
9.2 希尔排序
例子:
希尔增量排序
更多增量序列
C 语言实现:希尔排序 - 用Sedgewick增量序列
void ShellSort( ElementType A[],
int N )
{
int Si, D, P, i;
ElementType Tmp;
int Sedgewick[] = {
929,
505,
209,
109,
41,
19,
5,
1,
0};
for ( Si=
0; Sedgewick[Si]>=N; Si++ )
;
for ( D=Sedgewick[Si]; D>
0; D=Sedgewick[++Si] )
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;
}
}
9.3 堆排序
9.3.1 选择排序
9.3.2 堆排序
算法1
算法2**
C 语言实现
void Swap( ElementType *a, ElementType *b )
{
ElementType t = *a; *a = *b; *b = t;
}
void PercDown( ElementType A[],
int p,
int N )
{
int Parent, Child;
ElementType X;
X = A[p];
for( Parent=p; (Parent*
2+
1)<N; Parent=Child ) {
Child = Parent *
2 +
1;
if( (Child!=N-
1) && (A[Child]<A[Child+
1]) )
Child++;
if( X >= A[Child] )
break;
else
A[Parent] = A[Child];
}
A[Parent] = X;
}
void HeapSort( ElementType A[],
int N )
{
int i;
for ( i=N/
2-
1; i>=
0; i-- )
PercDown( A, i, N );
for ( i=N-
1; i>
0; i-- ) {
Swap( &A[
0], &A[i] );
PercDown( A,
0, i );
}
}
9.4 归并排序
归并算法的核心是:有序子列的归并
9.4.1 有序子列的归并
伪代码描述:
9.4.2 递归算法
C 语言实现
void Merge( ElementType A[], ElementType TmpA[],
int L,
int R,
int RightEnd )
{
int LeftEnd, NumElements, Tmp;
int i;
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( 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 MergeSort( ElementType A[],
int N )
{
ElementType *TmpA;
TmpA = (ElementType *)
malloc(N*
sizeof(ElementType));
if ( TmpA != NULL ) {
Msort( A, TmpA,
0, N-
1 );
free( TmpA );
}
else printf(
"空间不足" );
}
9.4.3 非递归算法
C 语言实现
void Merge_pass( ElementType A[], ElementType TmpA[], int N, int
length )
{
int i, j;
for ( i=
0; i <= N-
2*
length; i +=
2*
length )
Merge( A, TmpA, i, i+
length, i+
2*
length-
1 );
if ( i+
length < N )
Merge( A, TmpA, i, i+
length, N-
1);
else
for ( j = i; j < N; j++ ) TmpA[j] = A[j];
}
void Merge_Sort( ElementType A[], int N )
{
int
length;
ElementType *TmpA;
length =
1;
TmpA = 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 printf(
"空间不足" );
}