重新排列整数数组

时间:2017-09-15 21:19:13

标签: arrays algorithm sorting pseudocode

我需要在伪代码和java中实现以下内容。

输入:整数数组

输出:重新排列数组以具有以下内容:

  1. 假设原始数组中的第一个元素的值为x
  2. 在新数组中,假设x在位置I,即data [I] = x。然后,对于所有j> 1,所有j x的数据[j] <= x。这意味着x的“左”的所有值都小于或等于x,而“右”的所有值都大于x。
  3. 示例如下:假设数组具有初始顺序的元素:4,3,9,2,7,6,5。应用算法后,您应该得到:3,2,4,5,9,7,6。也就是说,最左边的元素4位于结果数组中,因此所有小于4(2和3)的元素都在其左侧(没有特定的顺序),所有大于4的元素都在其右侧(在没有特别的顺序)。
  4. 算法没有空间要求,只是问题在O(n)时间内得到解决。

    因此,我认为泡泡排序最好。

    在这种情况下,交换算法不是最好的选择,我想获得一些可以在这里实现的其他方法的反馈。

    谢谢!

3 个答案:

答案 0 :(得分:4)

创建一个包含空格的数组以适合所有元素。如果数字是&lt; x然后将它放在数组的开头,如果number是&gt; x然后把它放在最后。如果number等于x,则忽略它并继续前进。最后,用等于x的值填充剩余的点。

答案 1 :(得分:1)

java.util.array做了你说的话,但是我可能会错过一个关键的实现细节:就是这样:

int[] numbers = {4, 9, 1, 3, 2, 8, 7, 0, 6, 5};



System.out.println(Arrays.toString(numbers));

java.util.Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));

输出:

Before sorting: [4, 9, 1, 3, 2, 8, 7, 0, 6, 5]
After sorting: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  

使用整数4作为参考点,满足您列出的所有条件。本机排序算法会更快。但如果你需要掌控,请尝试第一个答案

得到4的所有值,只需找到4的索引,让我们说i [nth]并返回低于i [nth]的所有索引。得到4的数字,找到4的索引,即i [nth]并得到高于i [nth]的索引,而I [nth]小于[从零开始的数组]的数组的长度

答案 2 :(得分:0)

考虑到OP的小数据集,冒泡排序可行,但“......当n很大时,冒泡排序不是一种实用的排序算法。” (见bubblesort)。一个有效的算法是quicksort

  

...算法采用O(n log n)比较来排序n个项目。

以下QuickSort实现是我从Ideone获得的一个分支,并修改为包含OP数组和代码在数组的值上的代码,如下所示: / p>

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{


    public static void main (String[] args) throws java.lang.Exception
    {
        int b[] = { 4, 3, 9, 2, 7, 6, 5 };
        sort( b, 0, b.length - 1 );
        System.out.println( Arrays.toString( b ) );
    }

    static void sort(int a[], int left, int right)   {  
       if (left < right){
        int i=left, j=right, tmp;    
        int v = a[left]; //pivot

        do {
            while( a[i] < v)
              i++;
            while(a[j]>v) 
              j--;

            if( i <= j){            
               tmp = a[i];
               a[i] = a[j];
               a[j] = tmp;
               i++;            
               j--;
             }
       }  while( i <=  j );        

        if( left < j )  sort( a, left, j );
        if( i < right ) sort(a,i,right);
      }
   }
}

直播code

注意:此解决方案通过使用sort()调用本身取决于递归,具体取决于 i 的值,而 j 正确

或者,您可以像@Maxwell一样建议使用Java的本机sort(),因为它是QuickSort的快速实现(参见here)。