1035. 插入与归并

来源:互联网 发布:什么时候开放网络购彩 编辑:程序博客网 时间:2024/06/05 04:24

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

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




原创粉丝点击