洗净int数组,使偶数索引中的数组元素小于奇数索引中的数组元素

时间:2018-11-05 00:54:31

标签: algorithm

我需要使偶数索引arr [0],arr [2],arr [4]中的所有元素都小于奇数索引arr [1],arr [3],arr [5 ]等

我的方法是找到MEDIAN,然后在奇数索引中写出所有小于中位数的元素,并在偶数位置写出所有大于中位数的元素。

问题:找到中位数后,有没有办法在数组中进行数组改组?

import random
def quickselect(items, item_index):
    def select(lst, l, r, index):
        # base case
        if r == l:
            return lst[l]

        # choose random pivot
        pivot_index = random.randint(l, r)

        # move pivot to beginning of list
        lst[l], lst[pivot_index] = lst[pivot_index], lst[l]

        # partition
        i = l
        for j in range(l+1, r+1):
            if lst[j] < lst[l]:
                i += 1
                lst[i], lst[j] = lst[j], lst[i]

        # move pivot to correct location
        lst[i], lst[l] = lst[l], lst[i]

        # recursively partition one side only
        if index == i:
            return lst[i]
        elif index < i:
            return select(lst, l, i-1, index)
        else:
            return select(lst, i+1, r, index)

    if items is None or len(items) < 1:
        return None

    if item_index < 0 or item_index > len(items) - 1:
        raise IndexError()

    return select(items, 0, len(items) - 1, item_index)

def shuffleArray(array, median):
    newArray = [0] * len(array)
    i = 0
    for x in range(0,len(array),2):
        newArray[x] = array[i]
        i+=1

    for y in range(1,len(array),2):
        newArray[y] = array[i]
        i+=1

return newArray

1 个答案:

答案 0 :(得分:1)

这是我对问题的解释。

对数组进行混洗,以使偶数索引中的所有数据都小于奇数索引中的所有数据。 例如 [1, 3, 2, 4]有效,但[1, 2, 3, 4]无效。 这使我们无法对数组进行排序。

  1. 从最小到最大对数组进行排序。
  2. 在数组的中点(将中点向下舍入)拆分数组。
  3. 将两个数组混排在一起。这样,给定的数组[1, 2, 3]和数组[4, 5, 6]就变成了[1, 4, 2, 5, 3, 6]

要详细说明3,下面是一些示例代码...(使用javascript)

let a = [ 1, 2, 3 ];
let b = [ 4, 5, 6 ];
let c = [ ] // this will be the sorted array
for (let i = 0; i < a.length + b.length; i++ ) {
    if(i % 2 == 0) c.push( a[Math.floor( i/2 )]);
    else c.push( b[Math.floor( i/2 )]);
}

这将生成数组[1、4、2、5、3、6],我认为它满足了要求。