注册 登录
编程论坛 数据结构与算法

关于奇偶交换排序的一道题,求高手解答

hjcmj 发布于 2011-06-08 17:22, 7877 次点击
奇偶交换排序如下所述:第一趟对所有奇数i,将a【i】和a【i+1】比较;第二趟对所有的偶数i,将a【i】和a【i+1】比较。。(比较过程中若a【i】>a【i+1】,则将两者交换),第三趟对奇数i,第四趟对偶数i。。。以此类推直到整个序列有序为止。
(1):试问这种排序方法的结束条件是什么?
(2):分析当初始序列为正序或逆序两种情况下,奇偶交换排序过程中所需进行的关键字比较的次数。




这道题我想了很久都未有作出来,求高手解答呀
10 回复
#2
寒风中的细雨2011-06-08 20:05
程序代码:
#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;
}

#3
寒风中的细雨2011-06-08 20:13
程序代码:
#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;
}

只有本站会员才能查看附件,请 登录
#4
hjcmj2011-06-08 22:50
回复 2楼 寒风中的细雨
非常感谢!不过,这个不是c语言写的吧,我只学过c语言,这个,看不懂啊。。。能不能麻烦高手写个c的
#5
寒风中的细雨2011-06-08 23:46
这个是c
#6
lianjiecuowu2011-06-09 22:48
#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;   
}
这个是我自己编下的,肯定是不如版主的好,但是我想过啦
#7
hjcmj2011-06-09 23:59
回复 6楼 lianjiecuowu
灰常感谢呀。。。
#8
hjcmj2011-06-10 00:01
回复 5楼 寒风中的细雨
那。。。估计是我们学的还浅吧。
while (scanf("%d", &array[(*size)]))
    {
        ++(*size);
    }

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

    return true;

这个里面的++(*size);以及类似的语句完全不明白。。。看来要加紧研究了。。。谢谢版主了!
#9
ZaakDov2011-06-10 02:05
排序网络

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

正序交换0
逆序交换(n*n-n)/2 (就是C(n,2))
#10
hjcmj2011-06-10 22:58
回复 9楼 ZaakDov
感谢
#11
lianjiecuowu2011-06-11 07:55
回复 7楼 hjcmj
1