奇偶排序

实现排序函数,对一个整形序列进行排序,要求奇数在前,偶数在后。
如序列 1,2,3,4,5,6,排序后为 1,3,5,2,4,6。
函数原型:void sort(int src[], int len);

法 1:先将数组放在一个 vector 中,然后对 vector 整体进行排序,然后扫描两边,第一遍找出所有奇数,按数序放入 src 中,第二遍只找偶数,按数序放在奇数之后。此法需要额外的空间,当数据较大时,内存消耗大。

// C++ 实现
void sort(int src[], int len)
{
    vector<int> v(src, src + len);

    sort(v.begin(), v.end()); // 将数组元素放在 vector 中,整体排序

    int k = 0;
    for (int i = 0; i < len; i++) // 扫描 vector,找出全部奇数,按顺序放在前面
    {
        if (v[i] % 2 == 1)
        {
            src[k++] = v[i];
        }
    }
    for (int j = 0; j < len; j++) //找出全部偶数,按顺序放在奇数后面
    {
        if (v[j] % 2 == 0)
        {
            src[k++] = v[j];
        }
    }

    return;
}

法 2:双端指针,首尾指针分别向中间扫描,首指针查找偶数,尾指针查找奇数,如果奇数位置在偶数后面则两数对换,最终使前面部分是奇数,后部分是偶数。然后分别对奇数和偶数部分进行排序。不需要额外空间。

// C++ 实现
void sort(int src[], int len)
{
    int i = 0, j = len - 1;
    // 双向扫描,将奇数都对换到前面,偶数对换到后面
    while (i < j)
    {
        while(src[i] % 2 == 1) // 查找偶数
        {
            i++;
        }
        while(src[j] % 2 == 0) // 查找奇数
        {
            j--;
        }

        if (i < j) // 当奇数在偶数右边时对换
        {
            int temp = src[i];
            src[i] = src[j];
            src[j] = temp;

            i++;
            j--;
        }
    }
    sort(src, src + i); // 奇数单独排序
    sort(src + i, src + len); //偶数单独排序

    return;
}

你可能感兴趣的:(C/C++,数据结构和算法)