输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

我们首先会想到常规方法:创建一个临时数组,遍历所给数组中的所有元素,将偶数提取出来,再将临时数组中的偶数元素加入到原数组后边,但该方法存在致命缺点,临时数组的数组大小有上限,此时对于数组知识掌握不熟练的人可能会想到定义一个变量,用该变量存储数组长度,使其灵活可变,可是C语言中定义数组时不能使用变量。下面介绍一个稳妥的方法:

利用数组下标,可以进行数组元素的交换。定义左下标与右下表标,从两边对数组元素进行遍历,当左下标遇到奇数,继续向右遍历,直到遇见偶数为止,右下标也是如此,遍历到奇数为止;此时将左右下标所指的元素进行交换,则可使这两个数达到题目要求,以此类推,下面给出相应代码:

#include<stdio.h>
#include<assert.h>
//调整奇数偶数顺序
int* my_sort(int* arr,int left,int right){
	int* ret = arr;
	int temp = 0;
	assert(arr != NULL);

	while (left < right){
		//当左下标遇到奇数,继续向右遍历,直到遇见偶数为止	
		while ((left < right)&&(arr[left]%2==1)){
			left++;
		}
		//当右下标遇到偶数,继续向左遍历,直到遇见奇数为止
		while ((left < right) && (arr[right] % 2 == 0)){
			right--;
		}
		//当左<右,左边奇数和右边偶数进行交换
		if (left < right){//保证在每一次下标调整后都能满足使得结果成立的条件,可以避免一些特殊情况的发生
			temp = arr[left];
			arr[left] = arr[right];
			arr[right] = temp;
		}
	}
	return ret;
}

void print(const int * arr, const int len){
	for (int i = 0; i < len; i++){
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main(){
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int len = sizeof(arr) / sizeof(arr[0]);
	print(arr, len);
	print(my_sort(arr, 0, len - 1), len);
	return 0;
}

举一反三:
如果把题目改成数组中的数按照大小分为两部分,所有的负数在所有的非负数的前面,怎么办?
如果再把题目改改,变成 把数组中的数分成两部分,能被3整除的数都在不能被3整除的数的前面,怎么办?
原理都是大同小异,不做赘述

发布了54 篇原创文章 · 获赞 28 · 访问量 7271

猜你喜欢

转载自blog.csdn.net/jiangkun0331/article/details/105328314