关于奇偶交换排序的一道题,求高手解答
奇偶交换排序如下所述:第一趟对所有奇数i,将a【i】和a【i+1】比较;第二趟对所有的偶数i,将a【i】和a【i+1】比较。。(比较过程中若a【i】>a【i+1】,则将两者交换),第三趟对奇数i,第四趟对偶数i。。。以此类推直到整个序列有序为止。(1):试问这种排序方法的结束条件是什么?
(2):分析当初始序列为正序或逆序两种情况下,奇偶交换排序过程中所需进行的关键字比较的次数。
这道题我想了很久都未有作出来,求高手解答呀
#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; }
#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; }