2012-11-07 41 views
0

我不明白为什么这不起作用。我的插入排序算法有什么问题?

public class InsertionSort { 

    public static void main(String[] args) { 

     int x[] = { 9, 5, 8, 4, 3, 0, 6, 7, 2, 1 }; 
     int[] result = InsertionSortMethod(x); 

     for (int z = 0; z < x.length; z++) { 
      System.out.print(x[z] + " "); 
     } 
    } 

    public static int[] InsertionSortMethod(int x[]){ 
     for (int a = 0; a < x.length; a++) { 
      int divider = a; 
      if(divider > 0 & divider < x.length){ 
       if(x[divider] < x[0]){ 
        int temp = x[divider]; 
        for(int c = divider; c > 0; c--){ 
         x[c] = x[c-1]; 
        } 
        x[0] = temp; 
       } 
       if(x[divider] > x[divider-1]){ 
        x[divider] = x[divider]; 
       } 
       else{ 
        for(int b = divider-1; b > 0; b--){ 
         if(x[divider] < x[b]){ 
          int temp = x[divider]; 
          x[divider] = x[b]; 
          x[b] = temp; 
         } 
        } 
       } 
      } 
     } 
     return x; 
    } 

} 
+1

您收到了哪些错误?你有没有失败的样本输入和输出? –

+0

没有错误,这里是输出:0 3 4 5 8 6 7 2 1 9.我想弄清楚为什么整个数组没有正确排序。 – user1804933

+0

学习如何使用调试器遍历代码,看看它在做什么。这是一项非常有价值的技能。 –

回答

0

你说你要自己做,所以就这一点:

for(int b = divider-1; b > 0; b--){ 
    if(x[divider] < x[b]){ 
     int temp = x[divider]; 
     x[divider] = x[b]; 
     x[b] = temp; 
    } 
} 

如果具有索引阵列的一部分小于divider已经排序,并且x[divider]x[0]x[1]之间,例如(和divider大于3,说),然后x[divider] < x[divider-1],并在该循环立即交换到位置divider-1。但是,索引号divider的值刚好大于x[b],对于0 <= b <= divider-2,并且没有进一步的交换。一种可能的解决方法是在每次交换后更新divider,在if内更新divider = b;

0

下面是一个简单插入排序功能:

void insertionSort(int[] arr) { 

     int i, j, newValue; 

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

      newValue = arr[i]; 

      j = i; 

      while (j > 0 && arr[j - 1] > newValue) { 

        arr[j] = arr[j - 1]; 

        j--; 

      } 

      arr[j] = newValue; 

     } 

}