急救,有没有热心了帮我解决下问题,无限感激

GodDeath00 2012-11-19 11:56:53
将n个正整数存放于一个一维数组a中,试设计一个算法,将所有的奇数移动并存放于数组的前半部分,将所有的偶数移动并存放于数组的后半部分,要求尽可能少地使用临时存储单元,并使计算时间达到O(n)
...全文
256 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
derekrose 2012-11-20
  • 打赏
  • 举报
回复
两个指针,一个从前面扫,一个从后面扫,然后交换
Jm小海螺 2012-11-20
  • 打赏
  • 举报
回复
Zoelov 2012-11-20
  • 打赏
  • 举报
回复

void OddEven(int data[],int len)
{
	int i = 0;
	int j = len - 1;
	while(i < j)
	{
		while(i < j && data[j] % 2 == 0)// 从后面找奇数
			j--;
		while(i < j && data[i] % 2 != 0)// 从前面找偶数
			i++;
		int tmp = data[i];
		data[i] = data[j];
		data[j] = tmp;
		i++;
		j--;
	}
}
时间复杂度不是O(n)
rocktyt 2012-11-20
  • 打赏
  • 举报
回复
还可以这样,从前往后遍历,碰到偶数就记下位置,继续往后直到碰到奇数,然后交换,接着继续往后遍历 stl里有partition算法
bool isodd(int i)
{
	return i&1 == 1;
}
partition(a, a + sizeof(a)/sizeof(int), isodd);
rocktyt 2012-11-20
  • 打赏
  • 举报
回复
用了前闭后开区间
void partitionbyparity(int *begin, int *end)
{
	int *odd=begin, *even=end-1;
	while (odd < even)
	{
		while (((*odd%2) == 1) && (odd < end))
			odd++;
		while (((*even%2) == 0) && (even >= begin))
			even--;
		if (odd < even)
			swap(*odd, *even);
	}
}
Zoelov 2012-11-20
  • 打赏
  • 举报
回复

void OddEven1(int data[],int len)
{
	int i = 0;
	int j = len - 1;
	while(i < j)
	{
		if(data[i] % 2 !=0)
		{
			i++;
			continue;
		}
		if(data[j] % 2 == 0)
		{
			j--;
			continue;
		}
		int tmp = data[i];
		data[i] = data[j];
		data[j] = tmp;
	}
}
时间复杂度O(n)空间复杂度O(1)
derekrose 2012-11-20
  • 打赏
  • 举报
回复
引用 15 楼 sniffer12345 的回复:
引用 12 楼 luciferisnotsatan 的回复:引用 7 楼 derekrose 的回复:引用 2 楼 sniffer12345 的回复:引用 1 楼 derekrose 的回复:两个指针,一个从前面扫,一个从后面扫,然后交换 汗。。这种答案是极不负责任的 比如快排,快排嘛,不就分成两部分排序。但在哪里分,边界条件是什么,十个有七个写不对 比如红黑树,红……
呵呵
yinlincheng 2012-11-20
  • 打赏
  • 举报
回复
楼主的意思,不是太明白,只是单纯的将奇数放在前面,偶数放后面的话,楼上各位都说了算法了,如果要保持数据原来的相对位置的话,就没有那么简单了。比如数组为124365,你是希望结果是135246呢,还是奇数在前,偶数在后就行了。
sniffer12345 2012-11-20
  • 打赏
  • 举报
回复
引用 12 楼 luciferisnotsatan 的回复:
引用 7 楼 derekrose 的回复:引用 2 楼 sniffer12345 的回复:引用 1 楼 derekrose 的回复:两个指针,一个从前面扫,一个从后面扫,然后交换 汗。。这种答案是极不负责任的 比如快排,快排嘛,不就分成两部分排序。但在哪里分,边界条件是什么,十个有七个写不对 比如红黑树,红黑树嘛,不就平衡树,保证修改后平衡就行了。但怎么插入,怎么删……
嘿嘿 对啊 那哥们就中招了 帮我解了这道题
baichi4141 2012-11-20
  • 打赏
  • 举报
回复
这世界上总有一些人,他们在自己做事上不用心,但在让别人替自己做事上很用心
AndyZhang 2012-11-20
  • 打赏
  • 举报
回复
楼组你成功了哈哈
luciferisnotsatan 2012-11-20
  • 打赏
  • 举报
回复
引用 7 楼 derekrose 的回复:
引用 2 楼 sniffer12345 的回复:引用 1 楼 derekrose 的回复:两个指针,一个从前面扫,一个从后面扫,然后交换 汗。。这种答案是极不负责任的 比如快排,快排嘛,不就分成两部分排序。但在哪里分,边界条件是什么,十个有七个写不对 比如红黑树,红黑树嘛,不就平衡树,保证修改后平衡就行了。但怎么插入,怎么删除,怎么旋转,十个有九个不会写 哥们别说……
说不定是lz另一个号,激将法。让你帮他把作业做了
转角天边 2012-11-20
  • 打赏
  • 举报
回复
我也写了一个

int _tmain(int argc, _TCHAR* argv[])
{

	int  a[10]={1,2,4,3,12,6,18,8,9,10};
	int  i,j,temp;
	for(i=0,j=9;i<5;i++,j--)
	{
		if(a[i]%2!=0)
			continue;
		if(a[j]%2==0)
			continue;

		temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}

	for(i=0;i<10;i++)
	printf("%d ",a[i]);

	system("pause");
	return 0;
}
  • 打赏
  • 举报
回复
不好意思,原来是要奇数在前,那就把 "*(p+i)%2 != 0" 改成 “*(p+i)%2 == 0”吧
  • 打赏
  • 举报
回复

main()
{
   int a[10] = {1,2,5,10,9,2,4,6,8,3};
   int *p = a;
   int i = 0;
   int k = 9;

   for(i = 0; i < 5; ++i)
   {
       if(*(p+i) % 2 != 0)
       {
           *(p+i) ^= a[k];
           a[k] ^= *(p+i);
           *(p+i) ^= a[k];

           --k;
        }

        if(*(p+i) % 2 != 0)
        {
              --i;
         }
    }
}

从前往后找,遇到奇数就和后面的数对调位置,然后对调换到前面的数判断其是奇数还是偶数; 是奇数就继续放到后面去,是偶数就处理后面一个数。 基本思路就是这样了
sniffer12345 2012-11-20
  • 打赏
  • 举报
回复
引用 1 楼 derekrose 的回复:
两个指针,一个从前面扫,一个从后面扫,然后交换
汗。。这种答案是极不负责任的 比如快排,快排嘛,不就分成两部分排序。但在哪里分,边界条件是什么,十个有七个写不对 比如红黑树,红黑树嘛,不就平衡树,保证修改后平衡就行了。但怎么插入,怎么删除,怎么旋转,十个有九个不会写 哥们别说我challenge你,不信你就照着你说的“一个从前面扫,一个从后面扫,然后交换”,实现一个看看?
derekrose 2012-11-20
  • 打赏
  • 举报
回复

void reOrder(int* arr, unsigned int n){
    if(arr == 0 || n == 0) return;
    int p1 = arr, p2 = arr + n - 1;
    while(p1 < p2){
    while(p1 < p2 && ((*p1) & 1) == 1)
        p1++;
    while(p1 < p2 && ((*p2) & 1) == 0)
        p2--;
    if(p1 < p2) swap(*p1, *p2);
    
}
}
如有编译错误请原谅,因为第一次在这里写代码
derekrose 2012-11-20
  • 打赏
  • 举报
回复
引用 2 楼 sniffer12345 的回复:
引用 1 楼 derekrose 的回复:两个指针,一个从前面扫,一个从后面扫,然后交换 汗。。这种答案是极不负责任的 比如快排,快排嘛,不就分成两部分排序。但在哪里分,边界条件是什么,十个有七个写不对 比如红黑树,红黑树嘛,不就平衡树,保证修改后平衡就行了。但怎么插入,怎么删除,怎么旋转,十个有九个不会写 哥们别说我challenge你,不信你就照着你说的“一个……
哥们也别说我挑战你,我凭什么任你的要求写,如果我写出来了你会给我钱还是你会怎么样?我认为在这里寻求答案的人,当然他们是需要帮助,但是我认为他们更需要的不是你直接给他一串代码让他们去交差,而是提供一种解题的方法,也许这个方法这个思路不可取,大家可以互相探讨,不可取的方法一定是错误的存在吗?存在即合理,不可取的方法也许会激发更多可取的灵感。而且你的组织能力真是让我汗颜啊,我看了三遍,我也看不出你说的快排红黑树和现在我们正讨论的问题有什么相似之处,如有冒犯,多多得罪。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧