首页 > 其他 > 详细

如何重新排列数组使得数组左边为奇数,右边为偶数,并使得空间复杂度为O(1),时间复杂度为O(n)

时间:2014-03-11 15:38:26      阅读:569      评论:0      收藏:0      [点我收藏+]

思路分析:

类似快速排序的处理。可以用两个指针分别指向数组的头和尾,头指针正向遍历数组,找到第一个偶数,尾指针逆向遍历数组,找到第一个奇数,使用引用参数传值交换两个指针指向的数字,然后两指针沿着相应的方向继续向前移动,重复上述步骤,直到头指针大于等于尾指针为止。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "stdafx.h"
#include <iostream>
using namespace std;
void Swap(int& a, int& b)
{
    int temp = a;
    a = b;
    b = temp;
}
void ReverseArray(int arr[], int len)
{
    if (arr == NULL || len <= 0)
        printf("数组中无元素,变换毛线啊。");
    else
    {
        int begin = 0;
        int end = len - 1;
        while (begin < end)
        {
            while (arr[begin] % 2 == 1 && end>begin)
                begin++;
            while (arr[end] % 2 == 0 && end > begin)
                end--;
            Swap(arr[begin], arr[end]);
        }
    }
}
int main()
{
    int array[] = { 1, 23, 2, 34, 21, 45, 26, 22, 41, 66, 74, 91, 17, 64 };
    int len = sizeof(array) / sizeof(array[0]);
    int i;
    printf("原数组为:");
    for (i = 0; i < len; i++)
        printf("%d ", array[i]);
    printf("\n");
    ReverseArray(array, len);
    printf("经过变换后的数组为:");
    for (i = 0; i < len; i++)
        printf("%d ", array[i]);
    printf("\n");
    getchar();
    return 0;
}

  效果如图:

bubuko.com,布布扣

如何重新排列数组使得数组左边为奇数,右边为偶数,并使得空间复杂度为O(1),时间复杂度为O(n),布布扣,bubuko.com

如何重新排列数组使得数组左边为奇数,右边为偶数,并使得空间复杂度为O(1),时间复杂度为O(n)

原文:http://www.cnblogs.com/cysolo/p/3593011.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!