本题分为两个部分:一个是list的合并,一个是用while loop循环将合并后的数组从小到大进行排序——排序问题。
1. List的合并:
list的合并其实非常简单,只需要用“+”号对两个数组进行相加,另一个数组就会被加到前一个数组的末端,如代码:
list1=[7,3,10,12,5,1,2]list2=[4,6,11]list3=list1+list2print(list3)
最后输出的结果就会是:
简单相加,即可轻松完成两个列表的合并。
2.While loop的冒泡排序法:
本题其实最大的难点在于此,与普通的题目不同的是,本题题主所要求的排序,必须要使用While loop循环。
用来排序的算法有很多:冒泡排序、选择排序、插入排序等。
在这里我们选择了新手最常掌握的冒泡排序法:
冒泡排序法又叫交换排序法,每次会将相邻的两个数进行比较,如果这两个数不符合比较条件,则将其位置进行交换。
举个例子:
3,4,2,1 四个数
算法先将3、4进行比较,3<4,满足,则不动。
再将4、2进行比较,4不小于2,不满足,则4、2位置交换。
此时变成了 3,2,4,1
于是再比较4、1,4不小于1,不满足,4、1位置交换。
得到:3、2、1、4
可见在这一次的比较中,最大的一个数被排到了最后,一共有4个数字,则我们一共需要3次比较:
3、2、1、4
2、1、3、4
1、2、3、4
这就是冒泡排序法的原理:
每一次排序,根据你所设置的条件,将最大或最小的一个数归位,如上文例子所示,若有n个数,则需进行n-1次排序归位。
冒泡排序法通常是一种升序算法,你可以看到,最大的一个数,像气泡一样,慢慢从水底冒出水面,因此得名「冒泡排序法」
掌握了冒泡排序法的原理,要写出代码就不难了。
首先是它的核心部分——交换:
iflist3[i]>list3[i+1]:a=list3[i]list3[i]=list3[i+1]list3[i+1]=a
首先我们判断该数list3[i]与后一个数list3[i+1]的大小,若该数list3[i]大于后一个数list3[i+1],则开始进行交换:
我们需要先将该数list3[i]的值赋给一个新的变量,以保留原有的值。
2. 再将list3[i+1]的值赋给list3[i],此时的list3[i]便成了小的数字。
3. 然后把原有的数值(较大数),赋给list3[i+1],交换便完成了。
接着便是这一趟的循环比较部分,按题主要求使用While循环:
i=0whilei<len(list3)-1:iflist3[i]>list3[i+1]:a=list3[i]list3[i]=list3[i+1]list3[i+1]=ai+=1
于是在这,我们为刚刚上方的交换代码套上了一层循环。
可以看到,我们声明了一个为0的i变量,用于限制循环的次数,因为有n个数,我们只需要进行n-1次比较就够了
4个数,3次比较
因此此处写的是i < len(list3)-1:
而到这里,我们其实只完成了一趟比较,把当前最大的一个数排到了最后,因此我们还需要再进行几次比较。
多趟循环比较:
j=0whilej<len(list3)-1:i=0whilei<len(list3)-(j+1):iflist3[i]>list3[i+1]:a=list3[i]list3[i]=list3[i+1]list3[i+1]=ai+=1j+=1
完整的冒泡排序算法便是如上代码。除了i以外,我们还声明了一个j,同样也是用来限制循环次数,原理也是一样的,共有n个代码,则需比较n-1趟。
而除了多套了一个循环外,内部单趟比较的代码也有了改变,注意看第四行:
while i < len(list3)-(j+1):
在单趟比较的时候,我们用的还只是 len(list3)-1,而它变成 len(list3)-(j+1)是因为,上一趟已经将最大的数排到了最后,因此当轮到最后两个数进行比较的时候,我们便无需再比了,减少比较的次数,提高程序的效率。
观察运行过程:
代码主体已经完成,但为了加深对算法的理解,我们在这里使用极客战记内的say()输出语句(等同于print()语句),观察一下代码的运行过程。
首先是合并部分:
看看最后输出的结果:
接下来是排序部分:
我们在极客战记内随机定义两个List,在每次循环开始时,加入了一段hero.say()的输出语句,输出目前正常执行的操作。
代码如下:
在第一层循环前加一个输出,看看现在是第几趟排序
在第二层循环的开始加一个输出,看看目前是第几次排序,并查看排序的结果。
输出结果如图:
可以从图中发现,每一次循环,都将最大的数12往后挪了一次,还可看见其中第三第四次排序没有比较出结果,因此没有任何输出,利用在代码中插入输出语句,代码的运行过程清晰可见,更有助于理解算法以及修改代码。
关于代码调试,我们也有一篇文章专门讲解了新手常用的代码调试方法:
因此,题主所需的完整代码如下:
list1=[7,3,10,12,5,1,2]##随机定义了两个列表list2=[4,6,11]list3=list1+list2##列表的合并j=0whilej<len(list3)-1:i=0whilei<len(list3)-(j+1):iflist3[i]>list3[i+1]:a=list3[i]list3[i]=list3[i+1]list3[i+1]=ai+=1j+=1print(list3)
当然,这个问题已经有一年多了,我想题主的作业应该早就已经完成了……那就希望本答案能够帮到有需要的同学啦~
我们还有一篇回答对While loop循环以及循环的控制进行了详细的解析,如果有所需要,请点击下方链接:
如果觉得以上回答有一定帮助的话,麻烦动动小手点一下左下角的赞~,我们也将长期发布种种编程相关内容,有兴趣的话也可以点点右上角的关注按钮,谢谢~