1035. 插入与归并

排序算法忘完了。。。。百度了一下详细的插入和归并排序过程。。。然后参考的网上的代码。。。

#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;
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值