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 问题多多 希望诸位解答
你的 i 从 0 开始的话
while(position>0&&data[position-1].compareTo(key)>0)
就没成立 即没进行操作
和 i 从 1 开始没区别的
经过while循环之后是 4,9,23,23
之后用
data[position]=key;
来达到4,9,1,23的目的 结果数字1 还是没有拍到第一位
这是怎么回事
谢谢诸位的答案 小弟新学java 问题多多 希望诸位解答
没看懂楼主说的是?
不知道斑竹明白了吗?
是按要求的 1,4,9,23 啊
还有 楼主你的代码是 插入排序 别怀疑自己了
我的问题在于不理解while循环
我一直觉得这个循环是有问题的
在循环进行一次一次以后它没有达到交换位于position和position的值的目的 而是把position-1的值给予position在整个循环结束之后(就是大括号之后 才使用data[position]=key; 来达到使position和position-1互换的目的的)这样不能使position和position-1到0的下标的所有元素进行比较的
我的问题就是这个:不理解这个while循环 我一直觉得position--和data[position]=key;应该在一次循环里完成这样才能达到交换position和position-1的值的目的
谢谢 牛虽然我还是不清楚
我知道插入排序的原理
我的问题在于不理解while循环
我一直觉得这个循环是有问题的
在循环进行一次一次以后它没有达到交换位于position和position的值的目的 而是把position-1的值给予position在整个循环结束之后(就是大括号之后 才使用data[position]=key; 来达到使position和position-1互换的目的的)这样不能使 position和position-1到0的下标的所有元素进行比较的
我的问题就是这个:不理解这个while循环 我一直觉得position--和data[position]=key;应该在一次循环里完成这样才能达到交换position和position-1 的值的目的
谢谢 虽然我还是不清楚
之后再while循环外面 使前面的23变为1
没有正确理解while循环 比较的的下标是key 在前面其实已经定义的所以每一个都是在和1比较 而不是和变成23的1比较
谢谢你的回答