2014-10-01 97 views
0

我试图按排序顺序将元素添加到数组中。按排序顺序将元素插入数组

这是我的代码:

public class SortedInsertion { 

    public static void main(String[] args) { 

     int[] arr=new int[6]; 
     arr[0]=5; 
     arr[1]=6; 
     arr[2]=9; 
     arr[3]=11; 
     System.out.println(Arrays.toString(arr)); 
     insert(7,arr); 


    } 

    public static void insert(int val,int[] arr){ 
     int i; 
     for(i=0;i<arr.length-1;i++){ 

      if(arr[i]>val) 
       break; 
     } 
     for(int k=i;k<arr.length-1;k++){ 
      arr[k+1]=arr[k]; 
      arr[i]=val; 
     } 
     System.out.println(Arrays.toString(arr)); 


    } 

} 

我发现了输出为: [5,6,9,11,0,0]

[5,6,7,9 ,9,9]

但出于把正确的是

5,6,9,11,0,0

5,6,7,9,11,0

+1

'arr [k + 1] = arr [k]; arr [i] = val'被执行几次(for循环)。因此输出。 – TheLostMind 2014-10-01 07:11:09

+1

只需使用'System.arraycopy'移动尾部并腾出空间。它更快,更清晰。 – 2014-10-01 07:12:45

回答

1

更改insert方法是这样的:

public static void insert(int val,int[] arr){ 
     int i; 
     for(i=0;i<arr.length-1;i++){ 
     if(arr[i]>val) 
      break; 
     } 
     for(int k=arr.length-2; k>=i; k--){ 
     arr[k+1]=arr[k];    
     } 
     arr[i]=val; 
     System.out.println(Arrays.toString(arr)); 

    } 
+4

这需要o(n)个订单时间。任何人都可以写出更好的算法? – wittyurchin 2017-02-15 16:53:57

1

。在你的for循环的问题

for(i=0;i<arr.length-1;i++){} 

应该迭代高达i<arr.length

for(i=0;i<arr.length;i++){} 
1

这里

arr[k+1]=arr[k]; 

你覆盖了每一个数组元素用先前的值。你或许应该扭转你的循环,并从数组的末尾移动,移所有元素向前推,直到你找到正确的点,即:

public static void insert(int val, int[] arr) { 
    for(int i = arr.length - 1; i > 0; i--) { 
     if (arr[i] == 0) continue; // skip last elements to avoid array index out of bound 
     arr[i + 1] = arr[i];  // shift elements forward 
     if (arr[i] <= val) {  // if we found the right spot 
      arr[i] = val;   // place the new element and 
      break;     // break out the loop 
     } 
    } 
    System.out.println(Arrays.toString(arr)); 
} 
+0

谢谢。我做了这个改变。现在其工作正常 – 2014-10-01 07:17:23

+0

for(int k = arr.length-1; k> i; k-){ \t \t \t arr [k] = arr [k-1]; – 2014-10-01 07:18:07

+0

@ArunPrakash我已经更新了我的答案 – SimY4 2014-10-01 07:34:44

0

另一个解决的方法是使用List和collections.sort方法。

List<Integer> list = new ArrayList<Integer>(); 
    for (int i = 0; i < arr.length; i++) { 
    list.add(arr[i]); 
    } 
    list.add(val); 

    Collections.sort(list); 

int[] result = list.stream().mapToInt(Integer::intValue).toArray(); 
System.out.println(Arrays.toString(result)); 

希望这个解决方案有帮助。