c语言如何将数组中奇数跟偶数分开

c语言如何将数组中奇数跟偶数分开

C语言如何将数组中奇数跟偶数分开:使用双指针法、创建两个新数组、使用单次遍历法。在本文中,我们将详细讨论双指针法,并对其他方法进行简要介绍。

双指针法是一种高效的方法,它通过两个指针分别指向数组的头和尾部,并逐步将奇数和偶数移动到相应的位置。这个方法不仅节省空间,还能在一次遍历中完成任务。以下是详细的步骤和实现代码:

  1. 初始化两个指针,left 指向数组的起始位置,right 指向数组的末尾。
  2. left < right 的条件下进行循环:
    • 如果 arr[left] 是奇数,left 向右移动。
    • 如果 arr[right] 是偶数,right 向左移动。
    • 如果 arr[left] 是偶数且 arr[right] 是奇数,交换 arr[left]arr[right],然后分别移动 leftright

#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[],以及两个计数器 oddCountevenCount 初始化为 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

(0)
Edit1Edit1
上一篇 2024年8月29日 上午2:04
下一篇 2024年8月29日 上午2:04
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部