**错误版本1:**把A按奇偶排序后应该再分开排序
#include<stdio.h>
#include<stdlib.h>
void Swap(int *a,int *b)
{
int temp=0;
temp = *a; //temp = int类型,a=int *类型
*a=*b; //*a=*b 交换值, a=b交换地址
*b=temp;
}
int OddResort(int A[],int n) //交换排序
{
int left=0,right=n-1;//数组长度为n,数组下标从1~n-1
int temp=0;
/*奇数在前,偶数在后
从前往后找偶数,找到偶数就停止(if偶数left不动,把偶数交换到后面,if奇数left++),
从后往前找奇数,找到奇数就停止(if奇数right不动,把奇数交换到前面,if偶数right--),
当left<right,交换 */
while (left < right)
{
//left从前往后,找到偶数后停止
while ((left < right)&&(A[left] % 2 == 1))
{
left++;
}
//right从后往前,找到奇数后停止
while ((left < right)&&(A[right] % 2 == 0))
{
right--;
}
//交换一组奇偶数
if(left < right)
{
temp = A[left];
A[left] = A[right];
A[right] = temp;
//Swap(&A[left],&A[right]);
}
}
return left;
}
void Resort(int B[],int len)//冒泡排序(从小往大),每次大的一方确定一个,
{
int temp=0;
for(int i=0;i<len-1;i++) //数组有len个数,比较len-1轮
{
for(int j=0;j<len-1-i;j++)//每一轮确定一个数,所以内部循环len-i轮
{
if(B[j]>B[j+1])
{
temp = B[j];
B[j] = B[j+1];
B[j+1] = temp;
}
}
}
}
int main()
{
int A[1000],B[1000];
int m=0;
int n;//n数组长度
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
int left=0,right=n-1;//数组长度为n,数组下标从1~n-1
int temp=0;
/*奇数在前,偶数在后
从前往后找偶数,找到偶数就停止(if偶数left不动,把偶数交换到后面,if奇数left++),
从后往前找奇数,找到奇数就停止(if奇数right不动,把奇数交换到前面,if偶数right--),
当left<right,交换 */
while (left < right)
{
//left从前往后,找到偶数后停止
while ((left < right)&&(A[left] % 2 == 1))
{
left++;
}
//right从后往前,找到奇数后停止
while ((left < right)&&(A[right] % 2 == 0))
{
right--;
}
//交换一组奇偶数
if(left < right)
{
temp = A[left];
A[left] = A[right];
A[right] = temp;
//Swap(&A[left],&A[right]);
}
}
Resort(A,m);
for(int i=0;i<n;i++)
{
printf("%d",A[i]);
}
system("pause");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
/*
void Swap(int *a,int *b)
{
int temp=0;
temp = *a; //temp = int类型,a=int *类型
*a=*b; //*a=*b 交换值, a=b交换地址
*b=temp;
}
int OddResort(int A[],int n) //交换排序
{
int left=0,right=n-1;//数组长度为n,数组下标从1~n-1
int temp=0;
奇数在前,偶数在后
从前往后找偶数,找到偶数就停止(if偶数left不动,把偶数交换到后面,if奇数left++),
从后往前找奇数,找到奇数就停止(if奇数right不动,把奇数交换到前面,if偶数right--),
当left<right,交换
while (left < right)
{
//left从前往后,找到偶数后停止
while ((left < right)&&(A[left] % 2 == 1))
{
left++;
}
//right从后往前,找到奇数后停止
while ((left < right)&&(A[right] % 2 == 0))
{
right--;
}
//交换一组奇偶数
if(left < right)
{
temp = A[left];
A[left] = A[right];
A[right] = temp;
//Swap(&A[left],&A[right]);
}
}
return left;
}
*/
void Resort(int B[],int len)//冒泡排序(从小往大),每次大的一方确定一个,
{
int temp=0;
for(int i=0;i<len-1;i++) //数组有len个数,比较len-1轮
{
for(int j=0;j<len-1-i;j++)//每一轮确定一个数,所以内部循环len-i轮
{
if(B[j]>B[j+1])
{
temp = B[j];
B[j] = B[j+1];
B[j+1] = temp;
}
}
}
}
int main()
{
int A[1000],j[1000],o[1000];
int lenj=0,leno=0;
int n;//n数组长度
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
for(int i=0;i<n;i++)
{
if(A[i]%2==1)
{
j[lenj++]=A[i];
}
if(A[i]%2==0)
{
o[leno++]=A[i];
}
}
Resort(j,lenj-1);
for(int i=0;i<lenj;i++)
{
printf("%d",j[i]);
}
Resort(o,leno-1);
for(int i=0;i<leno;i++)
{
printf("%d",o[i]);
}
system("pause");
return 0;
}
成功运行结果
在这里插入图述
别人的最优解`
#include<stdio.h>
#include<stdlib.h>
void Swap(int *a,int *b)
{
int temp=0;
temp = *a; //temp = int类型,a=int *类型
*a=*b; //*a=*b 交换值, a=b交换地址
*b=temp;
}
void Sort(int B[],int len)//冒泡排序(从小往大),每次大的一方确定一个,
{
int temp=0;
for(int i=0;i<len-1;i++) //数组有len个数,比较len-1轮
{
for(int j=0;j<len-1-i;j++)//每一轮确定一个数,所以内部循环len-i轮
{
if(B[j]>B[j+1])
{
temp = B[j];
B[j] = B[j+1];
B[j+1] = temp;
}
}
}
}
int main()
{
int A[1000],j[1000],o[1000];
int lenj=0,leno=0;
int m=0,left=0,right=0;
int n;//n数组长度
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
left=0;//奇偶排序
right= n-1;
while(left<right)
{
while(left<right && A[left]%2==1)
left++;
while(left<right && A[right]%2==0)
right--;
Swap(&A[left],&A[right]);
}
/* 1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 7 3 4 5 6 2 8
1 7 3 5 4 6 2 8
*/
/*当数组数目为偶时,right left
下标left=right+1,是数组长度,A+left正好是偶数起始位置
当为奇,left=right
*/
Sort(A,left);
Sort(A+left,n-left);
for(int i=0;i<n;i++)
{
printf("%d ",A[i]);
}
system("pause");
return 0;
}