public class a{   public static void insertionSort(Comparable []data){
  
    for(int index=1;index<data.length;index++){
       Comparable key = data[index];
       int position = index;
         //shift larger values to the right
       while(position>0&&data[position-1].compareTo(key)>0){
         data[position] = data[position-1];//data[1]=data[0]
         position--;
       }
       data[position]=key;  //data[0]= key(key=data[1])
   }   
}
    
   public static void main(String []args){
    
    Comparable []c={4,9,23,1,45,27,5,2};
    insertionSort(c);
    for(int i=0;i<c.length;i++)
        System.out.println("插入排序:"+c[i]);
   }
}很明显外层循环是使整个数组的元素从第二个开始遍历一遍内层循环的作用(while循环的作用是:如果前面的元素的值大于后面的则后面的元素的值与前面的值相同,就像维基百科上说的使值后移)但是出了这个while循环以后 再把原来保存在变量key里的侯面的值交给前面的数这样就可以达到使前后两个数的值交换的目的了 
但是在while循环里判断只有一次就比如index=3时的情况 
经过while循环之后是 4,9,23,23
之后用
data[position]=key;
来达到4,9,1,23的目的 结果数字1 还是没有拍到第一位 
这是怎么回事 
谢谢诸位的答案 小弟新学java  问题多多 希望诸位解答

解决方案 »

  1.   

    楼主代码没什么问题啊
    你的 i 从 0  开始的话
    while(position>0&&data[position-1].compareTo(key)>0)
    就没成立 即没进行操作
    和 i 从 1 开始没区别的
      

  2.   

    就比如index=3时的情况  
    经过while循环之后是 4,9,23,23
    之后用
    data[position]=key;
    来达到4,9,1,23的目的 结果数字1 还是没有拍到第一位  
    这是怎么回事  
    谢谢诸位的答案 小弟新学java 问题多多 希望诸位解答

    没看懂楼主说的是?
      

  3.   

    我来解释下。首先在while循环里面他不是向后移动。它是在出现比它大的元素跟他换个位置,在开始的时候index为1时候,比较的下标0与1两个位置上的数字,相比只需比一次所以position只需为1,当index为2是,比较的是2与0,1上的比较,需要比较两次,position为2,在while循环当中进行了position--,循环结束找到了跟前面比它大的数,互换,后面同理,因此导致了最后的完整排序。
    不知道斑竹明白了吗?
      

  4.   

    当 index = 3 后 while 进行完
    是按要求的  1,4,9,23  啊
    还有 楼主你的代码是 插入排序 别怀疑自己了
      

  5.   

    我知道插入排序的原理 
    我的问题在于不理解while循环
    我一直觉得这个循环是有问题的
    在循环进行一次一次以后它没有达到交换位于position和position的值的目的 而是把position-1的值给予position在整个循环结束之后(就是大括号之后 才使用data[position]=key; 来达到使position和position-1互换的目的的)这样不能使position和position-1到0的下标的所有元素进行比较的 
    我的问题就是这个:不理解这个while循环 我一直觉得position--和data[position]=key;应该在一次循环里完成这样才能达到交换position和position-1的值的目的
    谢谢 牛虽然我还是不清楚
      

  6.   


    我知道插入排序的原理 
    我的问题在于不理解while循环
    我一直觉得这个循环是有问题的
    在循环进行一次一次以后它没有达到交换位于position和position的值的目的 而是把position-1的值给予position在整个循环结束之后(就是大括号之后 才使用data[position]=key; 来达到使position和position-1互换的目的的)这样不能使 position和position-1到0的下标的所有元素进行比较的 
    我的问题就是这个:不理解这个while循环 我一直觉得position--和data[position]=key;应该在一次循环里完成这样才能达到交换position和position-1 的值的目的
    谢谢 虽然我还是不清楚
      

  7.   

    index为3时,能达到1,4,9,23的目的啊
      

  8.   

    我觉得不可以他只是在while循环里把1的值转换为23
    之后再while循环外面 使前面的23变为1
      

  9.   

    我知道自己为啥错了  
    没有正确理解while循环 比较的的下标是key  在前面其实已经定义的所以每一个都是在和1比较 而不是和变成23的1比较
    谢谢你的回答