关于奇偶交换排序的一道题,求高手解答
奇偶交换排序如下所述:第一趟对所有奇数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
程序代码:#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
程序代码:#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;
}
2011-06-08 20:13
2011-06-08 22:50
2011-06-08 23:46

2011-06-09 22:48
2011-06-09 23:59
2011-06-10 00:01
2011-06-10 02:05
2011-06-10 22:58