算法:将元素分布得彼此远离

时间:2018-05-14 18:15:34

标签: algorithm sorting

我有一个排序整数数组。给定整数N,我需要将N个最大元素彼此远离,以使它们彼此之间具有最大空间。其余元素应放在这些大项目之间。例如,10 = N = 3的数组将导致[0,5,8,2,6,9,3,7,10,4]。

public static void main(String[] args) {
    int[] start = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    int[] end = new int[10];
    int N = 4;
    int step = Math.round(start.length / N );
    int y = 0;
    int count = 0;

    for (int i = 0; i < step; i++) {
        for (int j = i; j<start.length; j = j + step) {
            //System.out.println(j + " " + i);
            if (count < start.length && start[count] != 0) {
                end[j] = start[count];
                count++;
            }
        }

    }
    System.out.println(end.toString());

}

1 个答案:

答案 0 :(得分:1)

您有一组K个元素。您需要分发N个最大号码。然后:

  1. Step := K/N(删除剩余部分)
  2. N最大值中取出任意数字,然后将其插入Step/2位置。
  3. 取其他最大数字,并在Step距离之前插入的最大数字后插入。
  4. 给予[1,2,3,4,5,6,7,8,9,10]。所以K = 10N = 3。然后是Step = 3。因此,第一个最大值位于3/2位置

    [1,10,2,3,4,5,6,7,8,9]

    然后其他2彼此距离3

    [1,10,2,3,9,4,5,8,6,7]

    代码:

    std::vector<int> Distribute(std::vector<int> aSource, int aNumber)
    {
        auto step = aSource.size() / aNumber; // Note integer dividing.
        for (int i = 0; i < aNumber; ++i)
        {
            auto place = aSource.end() - i * step - step / 2;
            aSource.insert(place, aSource.front());
            aSource.erase(aSource.begin());
        }
        return aSource;
    }
    
    int main()
    {
        std::vector<int> vec{10,9,8,7,6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10};
        auto res = Distribute(vec, 4);
        for (auto e : res)
        {
            std::cout << e << ", ";
        }
        std::cout << std::endl;
    }
    

    输出:

    6, 5, 4, 7, 3, 2, 1, 0, 8, -1, -2, -3, -4, 9, -5, -6, -7, -8, 10, -9, -10,