作业帮 > 综合 > 作业

设一系列正整数存放在一个数组中,试设计算法,将所有奇数存放在数组的前半部分.(利用C语言)

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/12 03:56:12
设一系列正整数存放在一个数组中,试设计算法,将所有奇数存放在数组的前半部分.(利用C语言)
设一系列正整数存放在一个数组中,试设计算法,将所有奇数存放在数组的前半部分,将所有的偶数存放在数组的后半部分.要求尽可能的少用临时单元并使用时间少.(利用C语言)
/* 
\x09i从a的首部往后移动,j从a的尾部往前移动,若a[i]为偶数且a[j]为奇数,则交换,否则根据情况移动i或j.
\x09时间复杂度:length(a).
\x09空间复杂度:数组a.

\x09个人认为这是时空效率最好的,其他网友不服来辩.

*/

#include <iostream>
using namespace std;
const int n = 10;
int main()
{
\x09int a[n] = {3,18,2,12,12,5,6,7,8,9};
\x09int i = 0;
\x09int j = n;
\x09while (i < j)
\x09{

\x09\x09if (0 == a[i] % 2 && 1 == a[j] % 2)
\x09\x09{
\x09\x09\x09swap(a[i],a[j]);\x09//a[i] = a[i] ^ a[j]; a[j] = a[i] ^ a[j]; a[i] = a[i] ^ a[j];
\x09\x09\x09i++;
\x09\x09\x09j--;
\x09\x09\x09continue;
\x09\x09}

\x09\x09if (1 == a[i] % 2)
\x09\x09{
\x09\x09\x09i++;
\x09\x09}

\x09\x09if (0 == a[j] % 2)
\x09\x09{
\x09\x09\x09j--;
\x09\x09}
\x09}

\x09for (i = 0; i < n; i++)
\x09{
\x09\x09cout <<a[i] <<" ";
\x09}
\x09cout <<endl;
\x09return 0;
}


(如有任何疑问请追问,我一直在线)
再问: 改成C语言行吗?
再答: #include <stdio.h>\x09\x09//c语言标准输入输出头文件

#define n 10\x09\x09\x09//宏定义,数组的大小
void main()
{
    int a[n] = {3,18,2,12,12,5,6,7,8,9};\x09//初始化数组
    int i = 0;
    int j = n;
    while (i < j)
    {
 
        if (0 == a[i] % 2 && 1 == a[j] % 2)\x09//如果数组左边是偶数,右边是奇数
        {
            //swap(a[i],a[j]);
\x09\x09\x09
\x09\x09\x09/*交换两个数,这是最好的交换算法*/
\x09\x09\x09a[i] = a[i] ^ a[j]; 
\x09\x09\x09a[j] = a[i] ^ a[j]; 
\x09\x09\x09a[i] = a[i] ^ a[j];
            i++;
            j--;
            continue;\x09\x09\x09//交换之后后面的就不用执行了
        }
 
 
\x09\x09/*不符合交换条件那就i接着往后移动,j接着往前移动*/

        if (1 == a[i] % 2)\x09\x09
        {
            i++;
        }
 
        if (0 == a[j] % 2)
        {
            j--;
        }
    }
 
\x09/*输出*/
    for (i = 0; i < n; i++)
    {
\x09\x09printf("%d ",a[i]);
    }
    printf("\n");
}(如有任何疑问请追问,我一直在线)