Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在小于O(n^2)的JAVA中对数组的绝对值进行排序_Java_Arrays_Algorithm_Sorting - Fatal编程技术网

在小于O(n^2)的JAVA中对数组的绝对值进行排序

在小于O(n^2)的JAVA中对数组的绝对值进行排序,java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,给定一个包含正数和负数的排序数组(例如:-9、-7、-4、-0.9、1、2、3、8),我需要在不使用任何内置函数的情况下,以绝对值小于O(N^2)的顺序输出数组中的元素 有人知道这个简单问题的任何可接受的解决方案吗? 我正在考虑修改快速排序算法,使其检查元素的abs值。我将二进制搜索0,从概念上将列表分为两部分,并通过反向移动负值和正向移动将两个列表(负值一个作为其自身的正值)合并为一个新列表 O(logn)表示二进制搜索,O(n)表示两个排序列表的合并 我将二进制搜索0,从概念上将列表分成两部

给定一个包含正数和负数的排序数组(例如:-9、-7、-4、-0.9、1、2、3、8),我需要在不使用任何内置函数的情况下,以绝对值小于O(N^2)的顺序输出数组中的元素

有人知道这个简单问题的任何可接受的解决方案吗?
我正在考虑修改快速排序算法,使其检查元素的abs值。

我将二进制搜索0,从概念上将列表分为两部分,并通过反向移动负值和正向移动将两个列表(负值一个作为其自身的正值)合并为一个新列表


O(logn)表示二进制搜索,O(n)表示两个排序列表的合并

我将二进制搜索0,从概念上将列表分成两部分,并通过反向遍历负数和正向遍历正数,将两个列表(负数一个作为其本身的正值)合并为一个新列表

O(logn)表示二进制搜索,O(n)表示两个排序列表的合并

  • 选择任何运行时界限小于O(N^2)的双向比较排序算法。快速排序是一个有效的选择
  • 进行比较时(将在双向比较排序算法中显示),而不是比较值
    a
    b
    compare
    abs(a)
    abs(b)
    。只需确保不要将
    a
    b
    替换为
    abs(a)
    abs(b)
    ,只需在进行比较时使用后两者即可
      • 选择任何运行时界限小于O(N^2)的双向比较排序算法。快速排序是一个有效的选择
      • 进行比较时(将在双向比较排序算法中显示),而不是比较值
        a
        b
        compare
        abs(a)
        abs(b)
        。只需确保不要将
        a
        b
        替换为
        abs(a)
        abs(b)
        ,只需在进行比较时使用后两者即可

      只要在数组的末尾有两个指针,然后将绝对值与末尾进行比较

      start == array[0]
      end == array.length
      
      while start != end
      
        if abs(start) => end
          put start in front of end
          start++
          end--
        else
          end--
      
      我可能遗漏了一些片段,但这就是我的想法


      0(n)解决方案。

      只要在数组的末尾有两个指针,然后将绝对值与末尾进行比较

      start == array[0]
      end == array.length
      
      while start != end
      
        if abs(start) => end
          put start in front of end
          start++
          end--
        else
          end--
      
      我可能遗漏了一些片段,但这就是我的想法



      0(n)解决方案。

      我正在考虑修改快速排序算法,使其检查元素的abs值。
      --听起来不错。也可以从索引为0的任何位置开始,并在两个方向上向外移动,仅当指针的abs值小于另一个指针(pos和neg指针)时,才移动该指针由于这是Java,一个
      比较器可能会工作。标准排序算法可以与任何定义良好的比较方法一起工作。使用定义良好的比较方法在自己的代码中实现标准排序算法。这是两个数组的简单合并。它可以在O(N)时间内完成,或多或少。
      我正在考虑修改快速排序算法,让它检查元素的abs值。
      --听起来不错。也可以从索引为0的任何位置开始,并在两个方向上向外移动,如果指针的abs值小于另一个指针的abs值,则只移动该指针(一个pos和neg指针)由于这是Java,一个
      比较器可能会工作。标准排序算法可以与任何定义良好的比较方法一起工作。使用定义良好的比较方法在您自己的代码中实现一个标准排序算法。这是两个数组的简单合并。可以在O(N)中完成时间,多多少少。与这个答案相关的是,这听起来很像一个家庭作业问题。如果这是一个家庭作业问题,你对排序算法的选择应该基于你的好成绩。如果这不是一个家庭作业问题,我想知道为什么内置排序不适合这个任务。一般来说,如果ne问这样的问题,人们通常不会做出比那些以开发快速排序为生的计算机科学家的排序算法更好的排序算法。“快速排序是一个有效的选择。”不,在最坏的情况下,快速排序是O(N^2)。()与这个答案相关的是,这听起来非常像一个家庭作业问题。如果这是一个家庭作业问题,你对排序算法的选择应该基于你的好成绩。如果这不是一个家庭作业问题,我想知道为什么内置排序不适合这个任务。一般来说,如果有人问问题在这种情况下,人们通常不会使排序算法优于那些以开发快速排序为生的计算机科学家。“快速排序是一个有效的选择。”不,在最坏的情况下,快速排序是O(N^2)。()不需要O(logn)搜索。从两端开始,向中间移动。真正的热舔。一个更简单的方法是从底部移除项目,并在向下移动时将其合并到顶部。好吧,如果你使用的是真实数组,而不是理论数组,最好合并到第三个数组中,否则你将不得不向下推(或者至少将正值交换到空出的负值插槽中)。就地算法往往效率低下。这是我在实现中使用的想法,谢谢!不需要O(logn)搜索。从两端开始,向中间移动。真正的热舔。一个更简单的方法是从底部移除项目,并在向下移动时将其合并到顶部。好吧,如果你使用的是真实数组,而不是理论数组,最好合并到第三个数组中,否则你将不得不向下推(或者至少将正值替换为空的负值)。就地算法很容易失效