C语言如何将数组中奇数跟偶数分开:使用双指针法、创建两个新数组、使用单次遍历法。在本文中,我们将详细讨论双指针法,并对其他方法进行简要介绍。
双指针法是一种高效的方法,它通过两个指针分别指向数组的头和尾部,并逐步将奇数和偶数移动到相应的位置。这个方法不仅节省空间,还能在一次遍历中完成任务。以下是详细的步骤和实现代码:
- 初始化两个指针,
left
指向数组的起始位置,right
指向数组的末尾。 - 在
left < right
的条件下进行循环:- 如果
arr[left]
是奇数,left
向右移动。 - 如果
arr[right]
是偶数,right
向左移动。 - 如果
arr[left]
是偶数且arr[right]
是奇数,交换arr[left]
和arr[right]
,然后分别移动left
和right
。
- 如果
#include <stdio.h>
void separateOddEven(int arr[], int size) {
int left = 0, right = size - 1;
while (left < right) {
while (arr[left] % 2 != 0 && left < right) {
left++;
}
while (arr[right] % 2 == 0 && left < right) {
right--;
}
if (left < right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("n");
}
int main() {
int arr[] = {12, 17, 70, 15, 22, 65, 21, 90};
int size = sizeof(arr) / sizeof(arr[0]);
printf("Original array: n");
printArray(arr, size);
separateOddEven(arr, size);
printf("Array after separation: n");
printArray(arr, size);
return 0;
}
一、创建两个新数组
这种方法虽然简单,但在内存使用上不如双指针法高效。它通过创建两个新数组分别存储奇数和偶数,最后将这两个数组合并回原数组。
1. 初始化
首先,创建两个新数组 odd[]
和 even[]
,以及两个计数器 oddCount
和 evenCount
初始化为 0。
2. 遍历原数组
遍历原数组,将奇数存入 odd[]
中,将偶数存入 even[]
中,同时增加相应的计数器。
3. 合并数组
将 odd[]
和 even[]
合并回原数组。
#include <stdio.h>
void separateOddEven(int arr[], int size) {
int odd[size], even[size];
int oddCount = 0, evenCount = 0;
for (int i = 0; i < size; i++) {
if (arr[i] % 2 != 0) {
odd[oddCount++] = arr[i];
} else {
even[evenCount++] = arr[i];
}
}
int i = 0;
for (int j = 0; j < oddCount; j++) {
arr[i++] = odd[j];
}
for (int j = 0; j < evenCount; j++) {
arr[i++] = even[j];
}
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("n");
}
int main() {
int arr[] = {12, 17, 70, 15, 22, 65, 21, 90};
int size = sizeof(arr) / sizeof(arr[0]);
printf("Original array: n");
printArray(arr, size);
separateOddEven(arr, size);
printf("Array after separation: n");
printArray(arr, size);
return 0;
}
二、使用单次遍历法
单次遍历法通过在一次遍历中调整数组的位置,同样可以高效地分离奇数和偶数。
1. 初始化
设置一个索引 j
,用于跟踪奇数的插入位置。
2. 遍历数组
遍历数组,当遇到奇数时,将其插入到索引 j
的位置,并将 j
增加 1。
3. 调整数组
在遍历完成后,奇数将会被移动到数组的前面,偶数则会保留在数组的后面。
#include <stdio.h>
void separateOddEven(int arr[], int size) {
int j = 0;
for (int i = 0; i < size; i++) {
if (arr[i] % 2 != 0) {
if (i != j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
j++;
}
}
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("n");
}
int main() {
int arr[] = {12, 17, 70, 15, 22, 65, 21, 90};
int size = sizeof(arr) / sizeof(arr[0]);
printf("Original array: n");
printArray(arr, size);
separateOddEven(arr, size);
printf("Array after separation: n");
printArray(arr, size);
return 0;
}
三、双指针法的优点和应用
双指针法在分离奇数和偶数时具有显著的优点。它不仅节省了内存,还能在一次遍历中高效地完成任务。以下是双指针法的一些应用场景:
1. 排序问题
双指针法可用于解决各种排序问题,例如将负数和正数分开,或将特定条件的元素分离。
2. 数据处理
在大数据处理和实时数据流处理中,双指针法能够快速分离和处理数据,提高处理效率。
3. 图像处理
在图像处理和计算机视觉中,双指针法可用于快速分离不同类型的像素,如前景和背景。
四、总结
双指针法、创建两个新数组、单次遍历法是分离数组中奇数和偶数的三种主要方法。双指针法因其高效性和节省内存的特性,在实际应用中尤为广泛。通过详细的代码示例和应用场景分析,我们不仅理解了这些方法的实现,还掌握了它们的优缺点和适用场景。希望本文能为您在C语言编程中分离数组元素提供实用的参考和指导。
相关问答FAQs:
1. 如何在C语言中将一个数组中的奇数和偶数分开存储?
可以使用两个新的数组来实现将奇数和偶数分开存储。首先,我们需要遍历原始数组,然后将奇数存储到一个新的奇数数组中,将偶数存储到一个新的偶数数组中。
2. 怎样编写一个C语言程序,将给定数组中的奇数和偶数分开存储到两个不同的数组中?
为了实现这个目标,我们可以使用两个指针,一个指向奇数数组,一个指向偶数数组。然后,我们遍历原始数组,如果遇到奇数,就将其复制到奇数数组中,如果遇到偶数,就将其复制到偶数数组中。
3. 我想要将一个整数数组中的奇数和偶数分开存储,有没有简便的方法?
是的,C语言提供了一个简便的方法来将奇数和偶数分开存储。可以使用两个指针,一个指向数组的起始位置,一个指向数组的末尾位置。然后,我们比较指针所指向的元素,如果是奇数,就将其放在数组的前面,然后移动起始指针;如果是偶数,就将其放在数组的后面,然后移动末尾指针。这样,最终得到的数组就是奇数和偶数分开存储的。
原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/1107296