• 实现真正意义上的合并排序


                                        (算法老师布置这道题好长时间了,可是一直没有思路,真的是憋出来的代码啊)

        真正意义上的合并排序是按照给的数组来判断的,它分的不是两两一组,在四四一组排序,直到完全排完序,真正意义上的合并排序是指 先在数组上找到已有序的数组,分成几块,在进行合并。

      代码如下:

    #include <stdio.h>
    #define N 10
    #define flag1 1
    #define flag2 2
    int *FindOrder(int *a,int *b) //找到数组里有序的一段
    {

    int i=0,j=0;
    while(i>=0&&i<N)
    {

    if(a[i]==a[i+1]-1)
    {
    b[j]=flag1;

    }
    else
    {
    b[j]=0;
    }
    i++;
    j++;

    }
    for(i=0;i<N;i++)
    {
    if(b[i]==flag1&&b[i+1]==0)
    {
    b[i+1]=flag2;
    }
    }

    return b;
    }
    void Sort(int *a,int n,int *b)//排序
    {
    int i,j;
    int t;
    for(i=0;i<n-1;i++)
    { for(j=i+1;j<n;j++)
    {

    if(a[i]<a[j])
    {
    t=a[i];
    a[i]=a[j];
    a[j]=t;
    }
    }
    }
    for(i=0;i<n;i++)
    {
    b[i]=flag1;
    }
    b[n-1]=flag2;
    for(i=0;i<n;i++) //为了让排好序的数组融入原来的找到的有序数组所做的措施
    {
    if(b[i]==flag2&&b[i+1]==flag1)
    {
    b[i]=flag1;
    }
    }
    }
    int Find2(int *b) //找到数组中第一个2的位置
    {
    int i,j=0;
    for(i=0;i<N;i++)
    {
    if(b[i]==2)
    {
    break;

    }
    }

    return i;

    }
    int * DevideGroup(int *b,int *a) //分块
    {
    int i,j;
    int p=0;
    int m[N]={0};
    while(p<5)
    {
    for(i=0;i<N;i++)
    {
    if(b[i]==0&&b[i+1]==0)
    {
    Sort(a+i,2,b+i);
    break;

    }
    }

    for(j=0;j<N;j++)
    {
    if(b[j]==0&&b[j+1]==flag1)
    {
    Sort(a+j,Find2(b)+1,b+j);
    break;
    }
    }
    for(j=0;j<N;j++)
    {
    if(b[j]==flag1&&b[j+1]==flag1)
    {
    Sort(a+j,Find2(b)+1,b+j);
    break;
    }
    }
    for(j=0;j<N;j++)
    {
    if(b[j]==flag2&&b[j+1]==0)
    {
    b[j]=flag1;
    b[j+1]=flag2;
    break;
    }
    }
    for(j=0;j<N;j++)
    {
    if(b[j]==flag1&&b[j+1]==flag1)
    {
    Sort(a+j,Find2(b)+1,b+j);
    break;
    }
    }
    p++;
    }
    return a;

    }
    int main(void)
    {
    int a[N]={3,1,2,4,5,6,7,0,9,11};//已知数组
    int b[N]={0};//辅助数组,这个数组记录的是有序的数组位置,0 表示自己一个,凡是以1开头2结尾的是有序的数组元素、
    int *f,i,*m;
    printf("你的数据为: ");
    for(i=0;i<N;i++)
    {
    printf("%d,",a[i]);
    }
    f=FindOrder(a,b);
    m=DevideGroup(f,a);
    printf(" 排序后为: ");
    for(i=0;i<N;i++)
    {
    printf("%d,",m[i]);
    }
    printf(" ");
    }
    //3,1,2,4,5,6,7,0,9,11
    //4,3,1,2,3,6,7,3,3,3
    //5,4,5,2,5,6,8,4,7,9

    运行结果:

                 能否说个感想,哎呀妈呀,累死我了,算法设计思路有待提高啊,不能一道题花费了好长时间。。

                                                                                                                                                                                      by:暖暖要坚持

                                                                                                                                                                                        20150514

  • 相关阅读:
    java-Date类,DateFormat类,Calendar类
    vuex
    vue-router学习之二
    Vue-cli2.0
    ES6学习---箭头函数
    【学习】调用iframe中的方法
    【小技巧】只用css实现带小三角的对话框样式
    【转载】实现a元素href URL链接自动刷新或新窗口打开
    【转载】CSS filter:hue-rotate色调旋转滤镜实现按钮批量生产
    【小技巧】object上显示div
  • 原文地址:https://www.cnblogs.com/2714585551summer/p/4504808.html
Copyright © 2020-2023  润新知