7 7 5 void MSort Element Type A

  • Slides: 12
Download presentation

第 7章 排序 § 7. 5 归并排序 void MSort( Element. Type A[ ], Element.

第 7章 排序 § 7. 5 归并排序 void MSort( Element. Type A[ ], Element. Type Tmp. A [ ], int Left, int Right ) { int Center; /* 递归地将A[Left]~A[Right]排序 */ if ( Left < Right ) { /* 如果还有元素要排序 */ Center = ( Left + Right ) / 2; MSort( A, Tmp. A, Left, Center ); /*递归排左半边 T( N / 2 ) */ MSort( A, Tmp. A, Center + 1, Right ); /*递归排右半边T( N / 2 ) */ Merge( A, Tmp. A, Left, Center + 1, Right ); /*归并,O( N ) */ } } void Mergesort( Element. Type A[ ], int N ) 如果 Tmp. A 定义成Merge的局部变量, { 则每次调用Merge都需要开辟不同的空 Element. Type *Tmp. Array; /* 需要 O(N) 辅助空间*/ 间, 那么Element. Type S(N) = O( ) Tmp. Array = malloc( N * sizeof( ) ); log N N MSort( A, Tmp. Array, 0, N - 1 ); free( Tmp. A ); }

typedef struct Node *Ptr. To. Node; typedef Ptr. To. Node List; struct Node {

typedef struct Node *Ptr. To. Node; typedef Ptr. To. Node List; struct Node { int Key[Max. Digit]; /* Max. Digit是关� 字个数, Key可以定� 成 char� 型数� */ Ptr. To. Node Next; }; List Radix. Sort( List A ) /* 基数排序 */ { List Bucket[Radix];/* 建立Radix个桶 */ List Rear[Radix]; /* 需要�� 每个桶� 表的尾元素位置 */ int i, j, Digit; for ( i = Max. Digit-1; i >= 0; i-- ){ /* 从最次位关� 字开始 */ for ( j=0; j<Radix; j++ ) Bucket[j] = Rear[j] = NULL; /* 初始化 */ while (A) { /* 将关� 字逐一分配到桶 */ Digit = A->Key[i]; /* 取出当前关� 字位 */ if ( !Bucket[Digit] ) /* 若�� 的桶是空的 */ Bucket[Digit] = A; /* 放入空桶 */ else Rear[Digit]->Next = A; /* 否� 放入桶尾 */ Rear[Digit] = A; /* 更新尾指� */ A = A->Next; } /* � 束while分配� 程*/ for ( j=Radix-1; i>=0; j-- ){ /* 将所有桶中元素收集串� */ if ( Bucket[j] ) { Rear[j]->Next = A; A = Bucket[j]; } } /* � 束for收集� 程 */ } return A; }