花样排序

来源:互联网 发布:劳丽诗淘宝店生意如何 编辑:程序博客网 时间:2024/04/24 04:17

       看到标题,不要激动,我不是要讲一种新的排序算法,话说我现在也还不够能力去发现(发明?)一种新的算法,我只是要说出一种新的排序问题,而已。。。

       问题描述如下:
       请编程实现将输入自然数组中的数字按要求处理并放入到输出数组中
       1.  偶数按从大到小排序
       2.  奇数按从小到大排序
       3.  将奇数和偶数按顺序间插后放入输出数组,奇数在前,偶数在后。奇数和偶数数目不等,奇数和偶数数目不等时,多出的数字无法间插的就按顺序放置。
       比如:输入数组input[]={1,12,32,15,2,67,8,9,12,3,3,5}
                  输出数组output[]={1,32,3,12,3,12,5,8,9,2,15,67}

       实现函数:

void sort_cross(int a[],const int n,int b[]){    int cmp(const void *x,const void *y);    int i = 0,j = 0,k = 0;    int num_e = 0,num_o = 0;assert(NULL != a && NULL != b);    qsort(a,n,sizeof(int),cmp);    for(i = 0;i < n;++i)    {        if(a[i] & 1)        {            ++num_o;        }    }    num_e = n - num_o;    if(num_e >= num_o)    {        for(i = 0,j = 0,k = n - 1;i < n;++i)        {            if(a[i] & 1)            {                b[j] = a[i];j += 2;            }            else            {                if(k < 2*num_o - 1)                {--k;b[k] = a[i];                }else{b[k] = a[i];}--k;            }        }    }    else    {        for(i = 0,j = 0,k = 2*num_e - 1;i < n;++i)        {             if(a[i] & 1)             {                 if(j < 2*num_e)                 {                     b[j] = a[i]; j += 2;                 } else { b[j] = a[i]; ++j; }             }             else             {                 b[k] = a[i]; k -= 2;             }         }     }}int cmp(const void *x,const void *y){    return *(int *)x - *(int *)y;}


 

       测试程序:

#include <stdio.h>#include <stdlib.h>#include <assert.h>#define N 12int main(int argc,char **argv){    void sort_cross(int a[],const int n,int b[]);    int i = 0;int a[N] = {0},b[N] = {0};    printf("Please enter the array to be sorted:\n");    for(i = 0;i < N;++i)    {        scanf("%d",&a[i]);        printf("\t");    }    printf("\n");    sort_cross(a,N,b);    printf("The sorted array is:\n");    for(i = 0;i < N;++i)    {        printf("%d\t",b[i]);    }    printf("\n");system("pause");    return 0;}


 

       排序,不是难点,不管效率不顾消耗的话,来个最简单的冒泡法,不怕冒不出来他们的顺序,但是要实现间插,还要一个升序一个降序,貌似很简单的样子,但是,你晓得我花了好久才调出来正确的程序吗?算了,不说了,怕被高人鄙视。如果你不信我搞这个程序有这么艰难,不妨现在就着手写一个,怎样?

       间插的过程,先遍历一遍,得出奇数和偶数的个数,然后依据它们不同的大小关系,分别执行if和else的语句块,所以对数组读取了两遍。第一遍就是为了得出奇偶数个数,有点浪费时间了吗?想想还有木有只遍历一遍的方法喃。

原创粉丝点击