题目如下:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。同时保证原本数据的有序性,即奇数之间的相对位置不变,偶数之间的相对位置保持不变。
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
解题思路如下:
1、利用插入排序的思想进行求解,定义k来表示已经排序好的奇数个数
2、遍历数组,如果是奇数,就进入if语句,将此奇数不断向前交换,然后k++;如果是偶数,就直接++i
可以保证数据的稳定性
#include<stdio.h>
void reOrderArray(int *arr,int len)
{
int i = 0, j = 0;
//类似于插入排序的思想
int k = 0; //记录已经排好的奇数的个数
for (; i < len; ++i)//遍历数组
{
if (arr[i] % 2 == 1)//如果是奇数
{
j = i;//j记录当前下标的值
while(j > k)//下标值大于已经排列好的奇数的个数
//把奇数往前移动
{
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
--j;
}
++k;//已经排列好的奇数的个数+1
}
}
}
int main()
{
int brr[]={
1,2,4,3,5,6};
int len=sizeof(brr)/sizeof(brr[0]);
reOrderArray(brr,len);//调用调整函数
for(int i=0;i<len;++i)
{
printf("%d ",brr[i]);
}
printf("\n");
return 0;
}
运行结果如下:
代码演示图如下: