#include <iostream>
using namespace std;
void printList( int List[], int N ) {
for( int i = 0; i < N; i++ ) {
if(i) cout << " ";
cout << List[i];
}
}
bool check( int a[], int b[], int N ) {
for( int i = 0; i < N; i++ )
if( a[i] != b[i] ) return false;
return true;
}
/* 一次插入排序 */
void InsertionSort( int A[], int N, int Pos ) {
int i;
int Tmp = A[Pos]; /* 取出未排序序列中的第一个元素 */
for ( i = Pos; i > 0 && A[i-1] > Tmp; i-- )
A[i] = A[i-1]; /* 依次与已排序序列中元素比较并右移 */
A[i] = Tmp; /* 放进合适的位置 */
}
bool checkIS( int List1[], int List2[], int N ) {
int ListTmp[100];
for( int i = 0; i < N; i++ )
ListTmp[i] = List1[i];
for( int i = 1; i < N; i++ ) {
InsertionSort( ListTmp, N, i );
if( check(ListTmp, List2, N) ) {
cout << "Insertion Sort" << endl; // 符合
InsertionSort( ListTmp, N, i+1 ); // 再做一次
printList(ListTmp, N);
return true;
}
}
return false;
}
/* 一次归并排序 - 循环实现 */
/* 这里Merge函数在递归版本中给出 */
/* length = 当前有序子列的长度*/
/* L = 左边起始位置, R = 右边起始位置, RightEnd = 右边终点位置 */
void Merge( int A[], int TmpA[], int L, int R, int RightEnd ) {
/* 将有序的 A[L]~A[R-1] 和 A[R]~A[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++]; /* 将左边元素复制到TmpA */
else
TmpA[Tmp++] = A[R++]; /* 将右边元素复制到TmpA */
}
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]; /* 将有序的TmpA[]复制回A[] */
}
void Merge_pass( int A[], int 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 ) /* 归并最后2个子列*/
Merge( A, TmpA, i, i + length, N - 1 );
else /* 最后只剩1个子列 */
for ( j = i; j < N; j++ ) TmpA[j] = A[j];
}
void Merge_Sort( int A[], int N, int length ) { /* length = 初始化子序列长度*/
int *TmpA = new int[N];
if ( TmpA != NULL ) {
Merge_pass( A, TmpA, N, length );
delete[] TmpA;
}
else cout << "空间不足";
}
void checkMS( int List1[], int List2[], int N ) {
int ListTmp[100];
for( int i = 0; i < N; i++ )
ListTmp[i] = List1[i];
for( int length = 1; length < N; length *= 2 ) {
Merge_Sort( ListTmp, N, length );
if( check(ListTmp, List2, N) ) {
cout << "Merge Sort" << endl;
Merge_Sort( ListTmp, N, length*2 );
printList(ListTmp, N);
break;
}
}
}
int main() {
int N;
int List1[100], List2[100];
cin >> N;
for( int i = 0; i < N; i++ )
cin >> List1[i];
for( int i = 0; i < N; i++ )
cin >> List2[i];
if( !checkIS(List1, List2, N) )
checkMS(List1, List2, N);
}
我的思路很简单,先一轮一轮地做插入排序,如果某一轮结果与目标相同则再做一轮后输出
否则就一轮一轮地做归并排序直到与目标相同