当前位置:C++技术网 > 资讯 > 奇偶排序--简单算法演练

奇偶排序--简单算法演练

更新时间:2018-12-18 18:12:55浏览次数:1+次

下面我们看看这个算法是怎么描述的,既然是奇偶,肯定跟位数有关了
1:先将待排序数组的所有奇数位与自己身后相邻的偶数位相比较,如果前者大于后者,则进行交换,直到这一趟结束。
2:然后将偶数位与自己身后相邻的奇数位相比较,如果前者大于后者,则进行交换,直到这一趟结束。
3:重复1,2的步骤,直到发现无“奇偶”,“偶奇” 交换的时候,就认为排序完毕,此时退出循环。

① 待排序数组:                                                   9  2  1  6  0  7

② 所有奇数位与身后的相邻的偶数位比较交换       2  9  1  6  0  7

③ 所有偶数位与身后的相邻的奇数位比较交换       2  1  9  0  6  7

④ 所有奇数位与身后的相邻的偶数位比较交换       1  2  0  9  6  7

⑤ 所有偶数位与身后的相邻的奇数位比较交换       1  0  2  6  9  7

⑥ 所有奇数位与身后的相邻的偶数位比较交换       0  1  2  6  7  9

    我们可以看到,经过5趟排序后,我们的数组就排序完毕了,从图中②可以看到,如果每个线程分摊一个奇数位,那交换是不是只要一次就够了呢,可以看到这个算法在多核处理下面还是很有优势的。

最后的运行代码:

#include<stdio.h>
int main()
{
    int a[10],j[10]={0},o[10]={0},m=0,n=0,temp=0,i=0,jcount=0,ocount=0;
    while(scanf("%d %d %d %d %d %d %d %d %d %d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8],&a[9])!=EOF)
    {
        for(i=0,ocount=0,jcount=0;i<10;i++)
        {
            if(a[i]%2==1)
            {
                j[jcount]=a[i];
                jcount++;
            }
            else
            {
                o[ocount]=a[i];
                ocount++;
            }
        }
        for(m=0;m<jcount;m++)//冒泡
        {
           for(n=0;n<jcount-m-1;n++)
               if(j[n+1]>j[n])
               {
                   temp=j[n];
                   j[n]=j[n+1];
                   j[n+1]=temp;
               }
        }
 
        for(m=0;m<ocount;m++)
            for(n=ocount-1;n-m>0;n--)
            {
                if(o[n]<o[n-1])
                {
                    temp=o[n-1];
                    o[n-1]=o[n];
                    o[n]=temp;
                }
            }
        if(ocount>0)
        {
            for(i=0;i<jcount;i++)
            printf("%d ",j[i]);
            for(i=0;i<ocount-1;i++)
            printf("%d ",o[i]);
            printf("%d",o[ocount-1]);
        }
        else
        {
            for(i=0;i<jcount-1;i++)
            printf("%d ",j[i]);
            printf("%d",j[jcount-1]);
        }
        printf("\n");
    }
    return 0;
}