2014-10-01 92 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)); 

希望這個解決方案有幫助。