排序算法忘完了。。。。百度了一下详细的插入和归并排序过程。。。然后参考的网上的代码。。。
#include<stdio.h>
#include<stdlib.h>
int cmp ( const void *p1 , const void *p2 )
{
return *( int *)p1 - *( int *)p2 ;
}
int main ( )
{
int N , a[ 100 ] , b[ 100 ] , i , j , k ;
scanf("%d",&N);
for ( i = 0 ; i < N ; i ++ )
scanf("%d",&a[ i ] ) ;
for ( i = 0 ; i < N ; i ++ )
scanf("%d",&b[ i ] ) ;
for ( i = 0 ; b[ i ] <= b[ i+1 ] && i < N-1 ; i++ ) ; //找到开始无序的那个下标
for ( j = ++i ; a[ j ] == b[ j ] && j < N ; j ++ ) ; //从开始无序的那个下标开始判断后面是否没变
if ( j == N ) //前半部分有序,后半部分无改动则是插入排序
{
printf("Insertion Sort\n");
qsort( a , i+1 , sizeof ( int ) , cmp ); //排序的长度不是N
}
else
{
printf("Merge Sort\n");
//从最开始序列开始一步一步归并,直至和中间序列相同(第一个for循环),再进行下一步归并
for ( j = 1, i = 0 ; i < N && j <= N ; j *= 2 )
{
for ( i = 0 ; i < N && a[ i ] == b[ i ] ; i ++ ) ; //如果i=N,直接跳出,也就是说已经迭代过得序列和原序列相同,根据题意那就不用再排序了说明是有序序列
for ( k = 0 ; k < N / j ; k ++ ) //N/j表示有几对有j个元素的序列
qsort( a + k*j , j , sizeof ( int ) , cmp );
qsort( a + k*j , N%j , sizeof ( int ) , cmp ); //对非偶数序列的最后一项排序
}
}
for ( i = 0 ; i < N-1 ; i ++)
printf("%d ",a[ i ] );
printf("%d",a[ N-1 ] );
return 0;
}