(C)输入整数数组,奇数移到偶数之前且奇偶部分分别有序(2019.11.7)

/*
*function:将一个数组中的所有奇数移到偶数之前,要求奇偶内部有序
*way:用动态分配的方法输入一个数组,再将其分开成奇偶两个数组
*      最后分别实现冒泡排序,比较大小 
*Note: use free(point) and point=NULL to release the memory 
*/
#include<stdio.h>
#include<stdlib.h> //malloc、realloc 

void order(int a[],int length);//冒泡排序算法 
int main()
{
	printf("请输入整数数组:\n"); 
	int odd[128],eve[128],n=0;//定义奇偶数组 
	
	/*输入整型数组*/ 
	int *p = NULL;
	static int k=0;
	char ch;
	p = (int *)malloc(n*sizeof(int));//分配内存 
	while( (ch=getchar()) != '\n')
	{
		ungetc(ch,stdin);
		p=(int *)realloc(p,++n*sizeof(int));//增加内存 
		scanf("%d",&p[k++]);//输入数组 
	}
	
	/*将输入数组分开成奇偶两个数组*/
	static int a=0,b=0;//统计奇偶数组长度 			                                                                                                                                                                    	
	for(int i=0; i < n; i++)
	{
		if((p[i]%2) == 0)
		{
			eve[a] = p[i];//偶数组 
			a++;
		}
		else
		{
			odd[b]=p[i];//奇数组	
			b++;
		} 
	}
	

	order(eve,a);//偶数组内部排序 
	order(odd,b);//奇数组内部排序
	
	for(int i=0; i<b; i++)
	{
		printf("%d ",odd[i]);	
	}
	for(int i=0; i<a; i++)
	{
		printf("%d ",eve[i]);	
	}
	
	printf("\n");
	
	free(p);//释放内存空间,防止内存泄漏
	p = NULL;//指针赋值空,避免错误引用
	return 0;
} 

/*冒泡排序算法*/ 
void order(int a[],int length)
{
	int flag=1;
	for(int i=0;i<length && flag;i++)
	{
		flag=0;
		for(int j=0; j<length-1-i; j++)
		{
			if(a[j]>a[j+1])
			{
				flag=1;
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}	
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于这个问题,我可以提供一个解决方案,即使用两个指针,一个指针指向第一个元素,另一个指针指向最后一个元素,然后遍历数组,如果当前元素是奇数,将其与最后一个元素交换位置,并将指向最后一个元素的指针向前移动一位,如果当前元素是偶数,则将指向第一个元素的指针向后移动一位,直到所有元素遍历完成。 ### 回答2: 将所有奇数移到所有偶数之前的算法可以采用双指针的方法来实现。具体步骤如下: 1. 定义两个指针,一个指向数组的开头(称为oddPointer),一个指向数组的末尾(称为evenPointer)。 2. 使用一个循环来遍历整个数组。 3. 在每次循环中,判断oddPointer指向的元素是否为偶数。若是偶数,则将evenPointer指向的元素与oddPointer指向的元素进行交换,然后将evenPointer指向前一个位置,oddPointer不改变。 4. 若oddPointer指向的元素为奇数,则oddPointer前移一步,指向下一个元素。 5. 继续上述步骤,直到oddPointer和evenPointer相遇或交错。 这个算法的时间复杂度为O(n),其中n是数组的长度。下面是一个示例代码: ```python def moveOddBeforeEven(arr): oddPointer = 0 evenPointer = len(arr) - 1 while oddPointer < evenPointer: if arr[oddPointer] % 2 == 0: # 如果oddPointer指向的元素是偶数 arr[oddPointer], arr[evenPointer] = arr[evenPointer], arr[oddPointer] # 交换奇偶数位置 evenPointer -= 1 else: # 如果oddPointer指向的元素是奇数 oddPointer += 1 return arr # 示例测试 arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] result = moveOddBeforeEven(arr) print(result) ``` 上述算法通过双指针方法将所有奇数移到所有偶数之前,输出结果为:[1, 9, 3, 7, 5, 6, 2, 8, 4]。其中奇数部分[1, 9, 3, 7, 5]在偶数部分[6, 2, 8, 4]之前。 ### 回答3: 将所有奇数移到所有偶数之前的算法可以通过遍历数组的方式实现。具体步骤如下: 1. 定义两个指针,一个从数组首部开始,一个从数组尾部开始。分别命名为left和right。 2. 循环遍历数组,当left指针小于等于right指针时执行以下步骤: a. 判断left指针指向的元素是否为奇数,如果是奇数,则left指针向右移动一位。 b. 判断right指针指向的元素是否为偶数,如果是偶数,则right指针向左移动一位。 c. 如果left指针指向的元素是偶数,right指针指向的元素是奇数,则交换这两个元素。 3. 直到left指针大于right指针时,所有奇数都被移到了所有偶数之前。 这个算法的时间复杂度为O(n),其中n表示数组的长度。算法的核心思想是使用两个指针分别从数组的首尾开始,通过交换满足条件的元素来实现奇偶数的移动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值