题目
如标题(写完发现奇偶写反了……就改一下题目吧hhh)
代码
1、无序
为了方便弄个printfArray输出
void printfArray(int a[])
{
int i;
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
putchar('\n');
}
void disorderSort(int a[])
{
int i, j, k;
for (i = 0, j = 9; i < j; i++, j--) //相遇退出循环
{
while (a[i] % 2) i++; //从左到右找偶数
while (!(a[j] % 2)) j--; //从右到左找奇数
k = a[i];
a[i] = a[j];
a[j] = k; //交换
printfArray(a);
}
}
效果:
从左到右找到第一个偶数86,与从右到左第一个奇数99交换,以此类推
2、有序
有序是指奇数的相对位置不变,偶数的相对位置也不变
void orderSort(int a[])
{
int i, j, k, x;
for (i = 0; ; i++)
{
while (a[i] % 2) i++; //找到从左到右第一个偶数
j = i + 1;
while (!(a[j] % 2)) j++; //找到该偶数右边第一个奇数
if(j > 9) break; //便利完退出循环
for (x = j; x > i; x--) //向左冒一次泡(大概这个意思)
{
k = a[x];
a[x] = a[x - 1];
a[x - 1] = k;
}
printfArray(a);
}
}
效果
从左到右找到第一个偶数86,再找到86右边第一个奇数787,冒泡;
此时i = 1,继续,i++;
同理;
越到后面要移动的数字越多;
3、main函数
#include <stdio.h>
#include <stdlib.h>
void printfArray(int a[]);
void disorderSort(int a[]);
int main()
{
int a[10] = {
47, 86, 787, 87, 4, 79, 8, 98, 99, 2};
int n;
printf("原数组为:");
printfArray(a);
printf("有序or无序?\n1、有序\n2、无序\n");
scanf("%d",&n);
switch(n)
{
case 1: orderSort(a);
printf("奇偶排序后:");
printfArray(a);
break;
case 2: disorderSort(a);
printf("奇偶排序后:");
printfArray(a);
break;
default:printf("输入正确编号!\n");
}
return 0;
}