目录
题目:
解法一:三个数组(不推荐)
? ? ? ? 思维:
????????代码:
解法二:遍历,从两面同时填补(推荐)
? ? ? ? 思维:
? ? ? ? 代码:
解法三:双下标同时搜索(不推荐)
? ? ? ? 思维:
? ? ? ? 代码:
总结:
题目:
? ? ? ? 给你一个充满了随机数的数组,想办法将其中的奇数放在偶数前面。
像这样:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main ()
{
srand((unsigned int)time(NULL));
int arr[100]={0};
int i=0;
int sz=sizeof(arr)/4;
for(i=0;i<sz;i++)
{
arr[i]=rand()%1000+1;
}
}
解法一:三个数组(不推荐)
? ? ? ? 思维:
????????找出所有奇数放在数组1,找出所以偶数放在数组2,将两个数组合并即可,缺点是占空间大,更主要的是麻烦,因此不推荐。
????????代码:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main ()
{
srand((unsigned int)time(NULL));
int arr[100]={0};
int i=0;
int sz=sizeof(arr)/4;
for(i=0;i<sz;i++)
{
arr[i]=rand()%1000+1;
}
int arr1[100]={0};
int arr2[100]={0};
int x1=0;
int x2=0;
for(i=0;i<sz;i++)
{
if(arr[i]%2!=0)
{
arr1[x1]=arr[i];
x1++;
}
else if(arr[i]%2==0)
{
arr2[x2]=arr[i];
x2++;
}
}
if(x1==sz-1||x2==sz-1)//考虑极端情况
{
//无需排序
}
else
{
int count=x1+1;//计算有多少个奇数
int arr3[100]={0};
for(i=0;i<count;i++)
{
arr[i]=arr1[i];
}
int j=0;
for(;i<sz;i++)
{
arr[i]=arr2[j];
j++;
}
}
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
}
解法二:遍历,从两面同时填补(推荐)
? ? ? ? 思维:
? ? ? ? 创建一个数组arr,然后开始遍历题目给出的数组,若是奇数就从arr前面开始填补,若是偶数就从arr后面开始填补;
由于这种解法容易思考,容易实现,并且涵盖了极端情况,虽然空间占用劣于第三种,但根据摩尔定律,空间已经不再重要了,所以我个人认为这种写法优于其他两种。因此推荐。
? ? ? ? 代码:
int haha[100]={0};
int j=0;
int k=sz-1;
for(i=0;i<sz;i++)
{
if(arr[i]%2!=0)
{
haha[j]=arr[i];
}
else
{
haha[k]=arr[i];
}
}
解法三:双下标同时搜索(不推荐)
? ? ? ? 思维:
? ? ? ? 两个下标,从原数组两端搜索,满足左边对应偶数,右边对应奇数,则交换,没什么好说的。缺点是极端情况没有被涵盖,如果没有专门去思考极端情况能否成立,很容易漏掉,因此不太推荐。
? ? ? ? 代码:
int left=0;
int right=sz-1;
while(left<right)
{
while(arr[left]%2!=0&&left<right)//极端情况
{
left++;
}
while(arr[right]%2==0&&left<right)//极端情况
{
right--;
}
if(left<right)
{
int tmp=arr[left];
arr[left]=arr[right];
arr[right]=tmp;
}
}
总结:
? ? ? ? 方法不一定是时间最短,空间最小的才是最好的方法,最合适当下情况,能解决当下问题的方法,才是最好的方法。
|