首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按特定顺序排列数组中的元素

问按特定顺序排列数组中的元素
EN

Stack Overflow用户
提问于 2016-02-04 22:42:37
回答 3查看 2K关注 0票数 3

在Careercup上发现了这个面试问题

给定具有n个整数的数组A。重新排列数组,例如A<=A1>=A2<=A3>=A4<=A5等等

编辑:数组没有排序,必须在线性时间O(N)中进行排序。

我无法在线性时间内找到解决方案,我得到的最接近的方法是对数组进行排序,然后重新排列元素。有人知道如何在线性时间内完成吗?这能在线性时间内完成吗?

我建议的解决方案是在nlogn时间内对数组进行排序,然后用i-1和i+1交替地重新排列每个奇数元素i。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-04 22:57:24

您可以使用这个函数(代码在Swift中)在time O(n)中以Wave形式排列数组。

代码语言:javascript
复制
func wave(inout list: [Int]) {
    let evenIndexes = (0..<list.count).filter { $0 % 2 == 0 }

    for index in evenIndexes {
        if index > 0 && list[index] > list[index-1] {
            swap(&list[index], &list[index-1])
        }

        if index < list.count - 1 && list[index] > list[index+1] {
            swap(&list[index], &list[index+1])
        }
    }
}

该解决方案基于描述的这里算法。

测试

代码语言:javascript
复制
var test0 = [1,2,3,4,5,6]
wave(&test0)
print(test0) // [1, 3, 2, 5, 4, 6]

var test1 = [4, 6, 2, 1, 3, 7]
wave(&test1)
print(test1) // [4, 6, 1, 3, 2, 7]

var test2 = [20, 9, 4, 2, 0]
wave(&test2)
print(test2) // [9, 20, 2, 4, 0]

时间复杂度

该函数有一个n/2次执行的for loop (仅针对偶数索引)。因此,for循环具有时间复杂度O(n)。

在for loop中,我们找到了几个if then语句,这两个语句都是在固定时间内执行的,因此O(1)。

因此,时间复杂度是O(n) * O(1) = O(n),其中n是输入数组中的元素数。

票数 2
EN

Stack Overflow用户

发布于 2016-02-04 22:56:13

使用快速选择查找O(n)中数组的中值。这将允许您将数组划分为两个相等(或几乎相等)的部分:小于或等于中位数(A) (最多为n/2元素),其余(B),即定义为大于或等于中位数。

使用这两部分排列数组,如下所示:

代码语言:javascript
复制
A B A B A B A

这将是正确的,因为根据定义,每个项目A将小于或等于每个B。

票数 3
EN

Stack Overflow用户

发布于 2016-09-27 10:56:46

用C#算法实现O(n)解的C#实现:

代码语言:javascript
复制
public void WaveSortTest(int[] a)
{
    var nthElement = NthElement(a, a.Length / 2);
    var element = a[nthElement];

    var odd = 1;
    var even = 0;
    var r = new int[a.Length];
    for (int i = 0; i < a.Length; i++)
    {
        if (a[i] <= element)
        {
            r[even] = a[i];
            even += 2;
        }
        else
        {
            r[odd] = a[i];
            odd += 2;
        }
    }

    PrintArray(r);
}

private static readonly Random _rnd = new Random((int)DateTime.Today.ToFileTimeUtc());

private static int NthElement(int[] arr, int k)
{
    return NthElement(arr, 0, arr.Length, k);
}

private static int NthElement(int[] arr, int low, int high, int k)
{
    var pos = low + _rnd.Next(high - low);
    Swap(arr, pos, high - 1);

    var i = Partition(arr, low, high);

    if (k < i)
    {
        return NthElement(arr, low, i, k);
    }
    if (k > i)
    {
        return NthElement(arr, i + 1, high, k);
    }
    return i;
}

private static int Partition(int[] arr, int low, int high)
{
    var i = low - 1;
    for (var j = low; j < high; j++)
    {
        if (arr[j] <= arr[high - 1])
        {
            i++;
            Swap(arr, i, j);
        }
    }
    return i;
}

private static void Swap<T>(T[] a, int first, int second)
{
    var t = a[first];
    a[first] = a[second];
    a[second] = t;
}

private static void PrintArray(IEnumerable<int> arr)
{
    foreach (var item in arr)
    {
        Console.Write(item + " ");
    }
    Console.WriteLine();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35213109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档