| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7877 人关注过本帖
标题:关于奇偶交换排序的一道题,求高手解答
只看楼主 加入收藏
hjcmj
Rank: 2
来 自:西安
等 级:论坛游民
帖 子:9
专家分:10
注 册:2011-5-21
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
关于奇偶交换排序的一道题,求高手解答
奇偶交换排序如下所述:第一趟对所有奇数i,将a【i】和a【i+1】比较;第二趟对所有的偶数i,将a【i】和a【i+1】比较。。(比较过程中若a【i】>a【i+1】,则将两者交换),第三趟对奇数i,第四趟对偶数i。。。以此类推直到整个序列有序为止。
(1):试问这种排序方法的结束条件是什么?
(2):分析当初始序列为正序或逆序两种情况下,奇偶交换排序过程中所需进行的关键字比较的次数。




这道题我想了很久都未有作出来,求高手解答呀
搜索更多相关主题的帖子: 关键字 
2011-06-08 17:22
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:9 
程序代码:
#include <stdio.h>

#define MAX_SIZE 20

typedef enum { false, true }bool;

/*

 *获取控制台的输入

 */
bool get_inputs(int array[], unsigned int *size)
{
    printf("输入数组:");

    while (scanf("%d", &array[(*size)]))
    {
        ++(*size);
    }

    if ((*size)>MAX_SIZE)
    {
        return false;
    }

    return true;
}

/*

 *奇数下标元素开始的进行调整

 */
bool odd_sort(int array[], unsigned int size)
{
    unsigned int i;
    bool odd_flag = true;//奇数标志 

    for (i=1; i+1<size; i=i+2)
    {
        if (array[i] > array[i+1])
        {
            array[i] = array[i+1] + array[i];
            array[i+1] = array[i] - array[i+1];
            array[i] = array[i] - array[i+1];
            odd_flag = false;
        }
    }

    return odd_flag;
}
/*

 *偶数下标元素开始的进行调整

 */
bool even_sort(int array[], unsigned int size)
{
    unsigned int i;
    bool even_flag = true;//偶数标志

    for (i=0; i+1<size; i=i+2)
    {
        if (array[i] > array[i+1])
        {
            array[i] = array[i+1] + array[i];
            array[i+1] = array[i] - array[i+1];
            array[i] = array[i] - array[i+1];
            even_flag = false;
        }
    }

    return even_flag;
}
/*

 *输出整个的数组

 */
void display(int array[], unsigned int size)
{
    unsigned int i;

    for (i=0; i<size; ++i)
    {
        printf("%d ", array[i]);
    }
    printf("\n\n");
}

void function()
{
    int array[MAX_SIZE] = {0};
    unsigned int size = 0;//表示数组的长度

    if (!get_inputs(array, &size))
    {
        return;
    }

    while (!odd_sort(array, size) || !even_sort(array, size));

    display(array, size);
}

int main(void)
{
    function();

    return 0;
}

2011-06-08 20:05
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序代码:
#include <stdio.h>

#define MAX_SIZE 20
#define COUT printf("%d\n", counter++)

typedef enum { false, true }bool;
unsigned int counter = 0;
/*

 *获取控制台的输入

 */
bool get_inputs(int array[], unsigned int *size)
{
    printf("输入数组:");

    while (scanf("%d", &array[(*size)]))
    {
        ++(*size);
    }

    if ((*size)>MAX_SIZE)
    {
        return false;
    }

    return true;
}

/*

 *奇数下标元素开始的进行调整

 */
bool odd_sort(int array[], unsigned int size)
{
    unsigned int i;
    bool odd_flag = true;//奇数标志 

    for (i=1; i+1<size; i=i+2)
    {
        if (COUT, array[i] > array[i+1])
        {
            array[i] = array[i+1] + array[i];
            array[i+1] = array[i] - array[i+1];
            array[i] = array[i] - array[i+1];
            odd_flag = false;
        }
    }

    return odd_flag;
}
/*

 *偶数下标元素开始的进行调整

 */
bool even_sort(int array[], unsigned int size)
{
    unsigned int i;
    bool even_flag = true;//偶数标志

    for (i=0; i+1<size; i=i+2)
    {
        if (COUT, array[i] > array[i+1])
        {
            array[i] = array[i+1] + array[i];
            array[i+1] = array[i] - array[i+1];
            array[i] = array[i] - array[i+1];
            even_flag = false;
        }
    }

    return even_flag;
}
/*

 *输出整个的数组

 */
void display(int array[], unsigned int size)
{
    unsigned int i;

    for (i=0; i<size; ++i)
    {
        printf("%d ", array[i]);
    }
    printf("\n\n");
}

void function()
{
    int array[MAX_SIZE] = {0};
    unsigned int size = 0;//表示数组的长度

    if (!get_inputs(array, &size))
    {
        return;
    }

    while (!odd_sort(array, size) || !even_sort(array, size));

    display(array, size);
}

int main(void)
{
    function();

    return 0;
}

图片附件: 游客没有浏览图片的权限,请 登录注册


截图22.png (1.02 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-06-08 20:13
hjcmj
Rank: 2
来 自:西安
等 级:论坛游民
帖 子:9
专家分:10
注 册:2011-5-21
收藏
得分:0 
回复 2楼 寒风中的细雨
非常感谢!不过,这个不是c语言写的吧,我只学过c语言,这个,看不懂啊。。。能不能麻烦高手写个c的
2011-06-08 22:50
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
这个是c
2011-06-08 23:46
lianjiecuowu
Rank: 3Rank: 3
来 自:安徽
等 级:论坛游侠
帖 子:152
专家分:107
注 册:2011-5-20
收藏
得分:5 
#include <iostream>
using namespace std;
int main()
{
    const int N=10;
    int data[N];
    int i,loop,temp;
    cout<<"please input 10 numbers:"<<endl;
    for(i=0;i<10;i++)
    cin>>data[i];
    for(i=0;i<=N-2;i++)
    {
       for(loop=N-2;loop>=i;loop--)
       {
           if(data[loop]>data[loop+1])
           {
              temp=data[loop+1];
              data[loop+1]=data[loop];
              data[loop]=temp;
            
           }
           
       }
    }
    for(i=0;i<N;i++)
    cout<<data[i]<<'\t'<<endl;
    for(i=0;i<N;i+=2)
    cout<<data[i]<<'\t';
    for(i=1;i<N;i+=2)
    cout<<data[i]<<'\t';
   
    system("pause");
    return 0;   
}
这个是我自己编下的,肯定是不如版主的好,但是我想过啦

Sharp your mind!
2011-06-09 22:48
hjcmj
Rank: 2
来 自:西安
等 级:论坛游民
帖 子:9
专家分:10
注 册:2011-5-21
收藏
得分:0 
回复 6楼 lianjiecuowu
灰常感谢呀。。。
2011-06-09 23:59
hjcmj
Rank: 2
来 自:西安
等 级:论坛游民
帖 子:9
专家分:10
注 册:2011-5-21
收藏
得分:0 
回复 5楼 寒风中的细雨
那。。。估计是我们学的还浅吧。
while (scanf("%d", &array[(*size)]))
    {
        ++(*size);
    }

    if ((*size)>MAX_SIZE)
    {
        return false;
    }

    return true;

这个里面的++(*size);以及类似的语句完全不明白。。。看来要加紧研究了。。。谢谢版主了!
2011-06-10 00:01
ZaakDov
Rank: 2
等 级:论坛游民
帖 子:7
专家分:26
注 册:2011-6-10
收藏
得分:6 
排序网络

终止条件为连续的奇偶判断均不变位置

正序交换0
逆序交换(n*n-n)/2 (就是C(n,2))
2011-06-10 02:05
hjcmj
Rank: 2
来 自:西安
等 级:论坛游民
帖 子:9
专家分:10
注 册:2011-5-21
收藏
得分:0 
回复 9楼 ZaakDov
感谢
2011-06-10 22:58
快速回复:关于奇偶交换排序的一道题,求高手解答
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033352 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved