JAVA初学者问题,插入排序法,假设数组是3,2,1.请将i=2的时候代码运行过程帮我用语言描述下,谢谢。
答案:2 悬赏:40
解决时间 2021-02-16 19:46
- 提问者网友:我没有何以琛的痴心不悔
- 2021-02-15 23:11
JAVA初学者问题,插入排序法,假设数组是3,2,1.请将i=2的时候代码运行过程帮我用语言描述下,谢谢。
最佳答案
- 二级知识专家网友:旧脸谱
- 2021-02-16 00:13
23 1
while{
233 1
2231
}
123
看详解!
=========================================================
i=2.
在没有向下运行之前,可以知到.有序数列是 2,3,两个值,并且它们放在arr[0],arr[1]中
无序数列是1.放在arr[2]中
-------------------------------------------------
arr[0]arr[1]|| arr[2]
-------------------------------------------------
int insertVal=arr[i]=arr[2]=1;//借助变量insertVal=1."备份"了数组的第三个值
第三个值在这里确切的说是无序数组的第一个值
arr[index]=a[1]=3
while循环判断.insertVal=1<3..有序数组.0---->index .后面加一位,把放a[index]放到a[index+1]
这时候有序数组.比原来大了一号.而且最后两个数是重复的.2,3,3原来是2,3
while循环判断.insertVal=1<2.这个时候,有序数组,不增加了.而是让2后移一位.变成2,2,3
-------------------------------------------------------------------------------------------------
因为每循环以此,index都会提前去指向查找.
首先指向有序数组23中的3.经过以此循环指向2.可是它不知道前面是不是还有数字.它指向前2面的值.(这里假如2前面有个0.那么它现在指向0这个数,发现比1小).所以insertVal=1要放在下一个位置(0的下一个位置.index指向0.)所以跳出while循环后,a[index+1]=insertVal=1;
这个时候,数组变成了( 0 )1,2,3
------------------------------------
再看看当i=1的时候.
i等1.的时候,有序数组为3.一个无序数组为2,1两个
进入循环后,如果2比3大,直接跳出循环.把3放到2的下一位.也就是index+1
--------------------------------------------------------------------------------
这里明显2比3小.进行一次循环.从循环,一开始.有序数组就开始从最后一个数,和无序数组中第一个数拿出当中间值的数进行对比,也就是2先和3对比.2比3小.index接着往前走.并且有序数组最后一个数后移一位.也就是由3变成3,3.index指向两个3前面的值.这时候发现条件不适合.
跳出循环.让出现空缺的地方,填补上这个insertVal=2.
===================================================
---------------------------------------------------------------------------------数据量小的时候看着别扭
===================================================
现在有654321留个数.放在数组中.
---------------------------------------------------------------
第一次循环.(这里指的是外循环)
6 54321
while{
6 654321(而在事实中,5被传给了中间值,有序数组增大一,实际上6占用了5的位置)
}
56 4321
-----------------------------------------------------------------------
第二次循环.(这里指的是外循环)
56 4321
while{
5664321
5564321
}
456 321
-----------------------------------------------------------------------
第三次循环.(这里指的是外循环)
456 321
while{
4566 321
4556 321
4456321
}
3456 21
-----------------------------------------------------------------------
第四次循环.(这里指的是外循环)
3456 21
while{
34566 21
34556 21
3445621
33456 21(别忘记,2的位置体检传递给了中间值.实际上2的位置被6占了.所以数组大小并没有变)
}
3456 21
-----------------------------------------------------------------------
第五次循环.(这里指的是外循环)
23456 1
while{
234566 1
234556 1
2344561
233456 1(别忘记,1的位置体检传递给了中间值.实际上1的位置被6占了.所以数组大小并没有变)
2234561
}
123456
-----------------------------------------------------------------------
插入排序的突破点实际上就在于中间值,和这个"指针"index
如果将index与i的值的关系分开.可能就很容易了
i干扰了思维!
-----------------------------------------------------------------
实际上index的初始值,就是有序数列的最后一个数组索引
i的值就是无序数列的第一个索引.
拿出无序数列的第一个索引值,与有序数列的最后一个值,从尾到头一个一个对比.发现合条件
就放到哪里.
从一开始.无序数列就自己给自己先削了一个"头".而有序数列无论在内循环开始,还是没有进入内循环.就直接把自己的"势力"扩张了一个位置.
.无序数列的头.如果比有序数列所有的值都大,就直接放到刚刚"扩大"那一个位置
如果不确定,那就从有序数列的最后一个位置(实际上有序数列扩大了一个位置,应该算式倒数第二个才对)一直往前对比.凡是比他"大"的都往后移动一位,最后将它放到"中间位置"
while{
233 1
2231
}
123
看详解!
=========================================================
i=2.
在没有向下运行之前,可以知到.有序数列是 2,3,两个值,并且它们放在arr[0],arr[1]中
无序数列是1.放在arr[2]中
-------------------------------------------------
arr[0]arr[1]|| arr[2]
-------------------------------------------------
int insertVal=arr[i]=arr[2]=1;//借助变量insertVal=1."备份"了数组的第三个值
第三个值在这里确切的说是无序数组的第一个值
arr[index]=a[1]=3
while循环判断.insertVal=1<3..有序数组.0---->index .后面加一位,把放a[index]放到a[index+1]
这时候有序数组.比原来大了一号.而且最后两个数是重复的.2,3,3原来是2,3
while循环判断.insertVal=1<2.这个时候,有序数组,不增加了.而是让2后移一位.变成2,2,3
-------------------------------------------------------------------------------------------------
因为每循环以此,index都会提前去指向查找.
首先指向有序数组23中的3.经过以此循环指向2.可是它不知道前面是不是还有数字.它指向前2面的值.(这里假如2前面有个0.那么它现在指向0这个数,发现比1小).所以insertVal=1要放在下一个位置(0的下一个位置.index指向0.)所以跳出while循环后,a[index+1]=insertVal=1;
这个时候,数组变成了( 0 )1,2,3
------------------------------------
再看看当i=1的时候.
i等1.的时候,有序数组为3.一个无序数组为2,1两个
进入循环后,如果2比3大,直接跳出循环.把3放到2的下一位.也就是index+1
--------------------------------------------------------------------------------
这里明显2比3小.进行一次循环.从循环,一开始.有序数组就开始从最后一个数,和无序数组中第一个数拿出当中间值的数进行对比,也就是2先和3对比.2比3小.index接着往前走.并且有序数组最后一个数后移一位.也就是由3变成3,3.index指向两个3前面的值.这时候发现条件不适合.
跳出循环.让出现空缺的地方,填补上这个insertVal=2.
===================================================
---------------------------------------------------------------------------------数据量小的时候看着别扭
===================================================
现在有654321留个数.放在数组中.
---------------------------------------------------------------
第一次循环.(这里指的是外循环)
6 54321
while{
6 654321(而在事实中,5被传给了中间值,有序数组增大一,实际上6占用了5的位置)
}
56 4321
-----------------------------------------------------------------------
第二次循环.(这里指的是外循环)
56 4321
while{
5664321
5564321
}
456 321
-----------------------------------------------------------------------
第三次循环.(这里指的是外循环)
456 321
while{
4566 321
4556 321
4456321
}
3456 21
-----------------------------------------------------------------------
第四次循环.(这里指的是外循环)
3456 21
while{
34566 21
34556 21
3445621
33456 21(别忘记,2的位置体检传递给了中间值.实际上2的位置被6占了.所以数组大小并没有变)
}
3456 21
-----------------------------------------------------------------------
第五次循环.(这里指的是外循环)
23456 1
while{
234566 1
234556 1
2344561
233456 1(别忘记,1的位置体检传递给了中间值.实际上1的位置被6占了.所以数组大小并没有变)
2234561
}
123456
-----------------------------------------------------------------------
插入排序的突破点实际上就在于中间值,和这个"指针"index
如果将index与i的值的关系分开.可能就很容易了
i干扰了思维!
-----------------------------------------------------------------
实际上index的初始值,就是有序数列的最后一个数组索引
i的值就是无序数列的第一个索引.
拿出无序数列的第一个索引值,与有序数列的最后一个值,从尾到头一个一个对比.发现合条件
就放到哪里.
从一开始.无序数列就自己给自己先削了一个"头".而有序数列无论在内循环开始,还是没有进入内循环.就直接把自己的"势力"扩张了一个位置.
.无序数列的头.如果比有序数列所有的值都大,就直接放到刚刚"扩大"那一个位置
如果不确定,那就从有序数列的最后一个位置(实际上有序数列扩大了一个位置,应该算式倒数第二个才对)一直往前对比.凡是比他"大"的都往后移动一位,最后将它放到"中间位置"
全部回答
- 1楼网友:七十二街
- 2021-02-16 01:37
整形变量insertVal 是下标是i的元素的值,arr[index]是下标是i-1的下标的值。
while条件里,判断index是否大于等于0就是判断下标是i的元素前边是否还有元素,有元素的话,判断下标是i元素的值----insertVal和下标是i-1-----index的元素(即下标是i的元素的前一个元素)的值的大小,如果后边的大于前边的,则前后的值进行交换。如果不大于,在比较下标是i的元素的值和下标是i-2---index-1的元素的值,依次类推。
while条件里,判断index是否大于等于0就是判断下标是i的元素前边是否还有元素,有元素的话,判断下标是i元素的值----insertVal和下标是i-1-----index的元素(即下标是i的元素的前一个元素)的值的大小,如果后边的大于前边的,则前后的值进行交换。如果不大于,在比较下标是i的元素的值和下标是i-2---index-1的元素的值,依次类推。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯