算法题:奇偶分割数组
问题描述:写一个函数分割一个整数数组,使得奇数在前,偶数在后,要求不是用额外空间,在原数组中完成。
格式:输入一个整数数组,最后输出分割后的数组
输入样例:
[1,2,3,4]
输出样例:
[1,3,2,4]
1.注意事项:
1.要求在原数组中完成操作,意味着数组需要进行依次左移或者右移操作来为改变位置的元素腾出插入空间,适合选用插入排序。
2.判断条件:奇数:k%2=1;偶数:k%2=0;
3.操作顺序,首先提取奇数到前面并排序,然后确认奇偶数组的范围,对奇数和偶数分别排序并输出
2.算法设计思路:
使用插入排序算法的思想,将所有的奇数元素提到数组前面,完成奇偶分割操作,然后确定奇偶数组的范围,分别对其进行从小到大的排序。
插入排序算法
int temp,i,j;
for(i=0;i<n-1;i++){
temp=a[i+1];//暂存数据
j=i;
while(j>-1&&temp<a[j]){//右移腾出插入空间
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
奇偶分割数组代码
void oddEventArray(){
int n=4;//数组大小
int a[n];//初始化数组
int odd=0;//记录奇偶元素个数
//数组输入赋值
printf("请输入数组:");
int i,j,temp;
for(i=0;i<n;i++){
if(i==0)
scanf("[%d,",&a[i]);
else if(i==n-1)
scanf("%d]",&a[i]);
else
scanf("%d,",&a[i]);
if(a[i]%2==1) odd++;//统计奇数个数
}
printf("奇数个数:%d,偶数个数:%d\n",odd,n-odd);
//运用插入排序的思想对数组进行奇偶分割
printf("奇偶分割:\n");
for(i=0;i<n-1;i++){
temp=a[i+1];
j=i;
while(j>-1&&temp%2==1){//将奇数提到前面并对奇数排序
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
show(a,n);
}
//对奇数排序
for(i=0;i<odd-1;i++){
temp=a[i+1];
j=i;
while(j>-1&&temp%2==1&&temp<a[j]){
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
show(a,n);
}
//对偶数排序
for(i=odd;i<n-1;i++){
temp=a[i+1];
j=i;
while(j>odd-1&&temp%2==0&&temp<a[j]){
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
show(a,n);
}
printf("最终结果:");
show(a,n);
}
//输出结果
void show(int a[],int n){
int i;
for(i=0;i<n;i++){
if(i==0)
printf("[%d,",a[i]);
else if(i==n-1)
printf("%d]",a[i]);
else
printf("%d,",a[i]);
}
printf("\n");
}
3.操作结果