首先排列奇数,然后是偶数。奇数的顺序不应该改变

时间:2018-05-07 07:26:13

标签: arrays algorithm performance big-o

下面是重新排序奇数后跟偶数的代码片段,而不改变原始数组中偶数/奇数的顺序。

输入 - {1,4,8,3,9,12,7} 输出 - {1,3,9,7,4,8,12}

我们可以从空间中的O(n2)改善这一点(不使用额外的空间)吗?

public  static void reOrder(int[] arr) {
     int evenIndex  = arr.length;
     for(int i=0; i < arr.length;i++) {
            if(arr[i] % 2 == 0 && evenIndex == arr.length) //even index
                evenIndex = i;

            else if( arr[i] % 2 != 0 ) {
                if(i > evenIndex ) {
                    shift (arr, evenIndex , i);
                    evenIndex ++;
                }
            }
     }
}

static void shift(int[] arr, int evenIndex, int endIndex) {
    int temp = arr[endIndex];
    for(int i = endIndex; i > evenIndex ;i --) {
        arr[i] = arr[i-1];
    }
    arr[evenIndex] = temp;
}

1 个答案:

答案 0 :(得分:0)

您没有指定任何语言标记,因此我将使用python回答(因为我现在使用它的速度更快)。

如果您关心空间复杂性,您可以执行以下操作:

l = [1, 4, 8, 3, 9, 12, 7]
even_index = -1

for index in range(0, len(l)):
    if (l[index] % 2) == 0:
        if even_index == -1:
            even_index = index
    else:
        if (index > 0) and (even_index > -1):
            num = l[index]
            l.insert(even_index, num)
            del l[index + 1]
            even_index += 1
print(l)

您保留第一个偶数的位置索引,并在找到它们时通过列表插入奇数。然后你删除了#34; old&#34; index(现在增加1)。

我认为空间复杂性是您所需要的,但时间复杂性可以得到改善。

例如,在Python中,collections.deque在这种情况下可能更好,但时间复杂度不是优先事项。