7-38 实验7_3_奇数偶数 (100 分)奇数偶数排序

已知一个长度为n的整数数组,在保证原顺序的前提下,将该数组中所有的偶数放到所有的奇数之前,存到一个新数组中,并将新数组输出。

输入格式:

共2行,第一行为一个整数n(0<n<=200),代表输入整数个数,第二行为n个用空格分隔的整数,需保存在待处理数组中。测试用例保证所有整数可以用int存储。

输出格式:

只有一行,为新数组中的元素,数与数之间用一个空格分隔,第n个数后是换行符。

样例">输入样例:

10
3 9 4 5 8 7 10 2 6 1

输出样例:

4 8 10 2 6 3 9 5 7 1

代码如下:

#include<stdio.h>
int main()
{
	int n, i, j, x;
	int ar1[200] = { 0 };
	int ar2[400] = { 0 };
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &ar1[i]);
	for (i = 0,j=0; i < n; i++)
	{
		if (ar1[i] % 2 == 0)
		{
			ar2[j] = ar1[i];
			j++;
		}
	}
//用两个for循环,分开处理奇数和偶数
	for (i = 0; i < n; i++)
	{
		if (ar1[i] % 2 != 0)
		{
			ar2[j] = ar1[i];
			j++;
		}
	}
		printf("%d", ar2[0]);
	for (i = 1; i < 400; i++)
		if (ar2[i] != 0)
			printf(" %d", ar2[i]);
	printf("\n");
	return 0;
}

这里就是要注意把偶数和奇数分开处理,,如果在一个for循环中,会比较难受哦 

 第二种写法:

首先明确0既不是奇数又不是偶数

所有可以取巧为:

代码如下:

#include<stdio.h>
int main()
{
	int n, i, j,x;
	int ar1[200] = { 0 };
	int ar2[400] = { 0 };
//输入
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &ar1[i]);
//操作
	for (i = 0,j=0,x=201; i < n; i++)
	{
		if (ar1[i] % 2 == 0)
		{
			ar2[j] = ar1[i];
			j++;
		}
		else
		{
			ar2[x] = ar1[i];
			x++;
		}
	}
//输出
	printf("%d", ar2[0]);
	for (i = 1; i < 400; i++)
		if (ar2[i] != 0)//!!
			printf(" %d", ar2[i]);
	printf("\n");
	return 0;
}

如果想练习数组内的元素的移动,可以尝试在一个数组(通过偶数和奇数的换位置)解决问题

代码如下:

void swap1(int* ar, int i)
{
	int k = ar[i];
	int j = 0;
	for (j = i; j > 0; j--)
		ar[j] = ar[j - 1];
	ar[0] = k;
}
void swap2(int* ar, int i, int n)
{
	int k = ar[i];
	int j = 0;
	for (j = i; j < n - 1; j++)
		ar[j] = ar[j + 1];
	ar[n - 1] = k;
}
#include<stdio.h>
int main()
{
	int n, i, j, x;
	int ar[200] = { 0 };
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &ar[i]);
	for (i = 0; i < n; i++)
	{
		if (ar[i] % 2 == 0)
			swap1(ar, i);
		else
			swap2(ar, i, n);
	}
	printf("%d", ar[0]);
	for (i = 1; i < n; i++)
		printf(" %d", ar[i]);
	printf("\n");
	return 0;
}

代码颇为长,但也不失为一种思路

这里我用三种不同的写法完成了题目,大家取舍 

### C语言顺序表奇偶元素到新顺序表并输出 以下是基于给定需求的C语言代码实现,该程序可以将顺序表中的奇数偶数别放入两个新的顺序表中,并输出表以及这两个新表的内容。 #### 完整代码实现 ```c #include <stdio.h> #define MAXSIZE 100 typedef int Datatype; typedef struct { Datatype data[MAXSIZE]; int length; } SequenceList; // 初始化顺序表 void InitSequenceList(SequenceList *L) { L->length = 0; } // 尾插法向顺序表插入数据 void InsertTail(SequenceList *L, Datatype value) { if (L->length >= MAXSIZE) { printf("顺序表已满\n"); return; } L->data[L->length++] = value; } // 输出顺序表 void PrintSequenceList(const char* name, const SequenceList *L) { printf("%s: ", name); for (int i = 0; i < L->length; ++i) { printf("%d ", L->data[i]); } printf("\n"); } // 离奇偶元素至新顺序表 void SeparateOddEven(const SequenceList *original, SequenceList *oddList, SequenceList *evenList) { for (int i = 0; i < original->length; ++i) { if (original->data[i] % 2 == 0) { InsertTail(evenList, original->data[i]); // 插入偶数列表 } else { InsertTail(oddList, original->data[i]); // 插入奇数列表 } } } int main() { SequenceList originalList, oddList, evenList; // 初始化三个顺序表 InitSequenceList(&originalList); InitSequenceList(&oddList); InitSequenceList(&evenList); // 输入实验数据 int test_data_1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60}; int test_data_2[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; // 加载第一个测试数据集 for (int i = 0; i < sizeof(test_data_1)/sizeof(test_data_1[0]); ++i) { InsertTail(&originalList, test_data_1[i]); } // 调用离函数 SeparateOddEven(&originalList, &oddList, &evenList); // 输出结果 PrintSequenceList("Original List", &originalList); // 顺序表 PrintSequenceList("Odd Numbers", &oddList); // 奇数顺序表 PrintSequenceList("Even Numbers", &evenList); // 偶数顺序表 // 清空有数据,加载第二个测试数据集 InitSequenceList(&originalList); InitSequenceList(&oddList); InitSequenceList(&evenList); for (int i = 0; i < sizeof(test_data_2)/sizeof(test_data_2[0]); ++i) { InsertTail(&originalList, test_data_2[i]); } // 再次调用离函数 SeparateOddEven(&originalList, &oddList, &evenList); // 输出结果 PrintSequenceList("Original List", &originalList); // 顺序表 PrintSequenceList("Odd Numbers", &oddList); // 奇数顺序表 PrintSequenceList("Even Numbers", &evenList); // 偶数顺序表 return 0; } ``` --- #### 功能说明 上述代码实现了以下功能: 1. **初始化顺序表**:通过`InitSequenceList`函数清空顺序表。 2. **尾部插入数据**:利用`InsertTail`函数逐个将输入的数据加入顺序表[^3]。 3. **离奇偶元素**:核心逻辑由`SeparateOddEven`完成,遍历顺序表并将奇数偶数别插入对应的顺序表[^4]。 4. **打印顺序表内容**:借助`PrintSequenceList`函数展示各顺序表的结果。 --- #### 示例运行结果 对于两组实验数据 `(1,2,3,4,5,6,7,8,9,10,20,30,40,50,60)` 和 `(10,20,30,40,50,60,70,80,90,100)` 的执行结果如下: ##### 数据集 1 结果 ``` Original List: 1 2 3 4 5 6 7 8 9 10 20 30 40 50 60 Odd Numbers: 1 3 5 7 9 Even Numbers: 2 4 6 8 10 20 30 40 50 60 ``` ##### 数据集 2 结果 ``` Original List: 10 20 30 40 50 60 70 80 90 100 Odd Numbers: Even Numbers: 10 20 30 40 50 60 70 80 90 100 ``` --- #### 时间复杂度- 遍历一次顺序表即可完成奇偶类操作,时间复杂度为 \(O(n)\)[^2]。 - 如果需要进一步对奇数偶数子表进行排序,则额外增加 \(O(k \log k)\) 或 \(O(m \log m)\),其中 \(k\) 和 \(m\) 别表示奇数偶数的数量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值