查找
顺序查找 折半查找
1 | # -*- coding: utf-8 -*- |
排序
插入排序
这些必须掌握的知识,不要觉得太简单,自己明了算法思想。还是稳妥写出来。拿到一个待排序列表,从第二个元素(数组下标为1)开始,将其作为待插入元素,首先和紧邻的前一个元素比较,如果小于它,则它需要进行下面的找到自己正确的位置(默认从小到大排序),index=i,temp=lis[i],分别记录当前元素下标以及值。接下来不断和之前的元素相比较,i的遍历范围是range(j-1,-1,-1),即从待插入元素的上一个紧邻元素开始,一直找到正确的位置,循环体逻辑是lis[j] > temp 就说明待插入元素还更小,需要lis[j+1] = lis[j]更改元素,同时index更新为j,这个index为了待插入元素的最后位置,接着执行range(j-1,-1,-1),这个循环直到j到0就跳出,最后lis[index] = temp。
简单选择排序
每次选择最小的元素,提到简单选择排序,这就是大家耳熟能详的回答,talk is really cheap,从i出发,range(0,n) ,比如第一轮,min为i,从0开始,j的范围是range(i+1,n),比较lis[min]>lis[j],min=j,min是在j的range(i+1,n)循环里不断改变的,(如果不能做到min=j写在循环里还是循环外,这就是没掌握),跳出j的循环,就找到本轮的最小值,lismin]和lis[j]互换。接着i为1,又开始寻找剩下元素中最小的元素。
冒泡排序
有很多实现方式,关键你能马上写出来,不然真的太廉价了。大家都知道每趟选出最大(小)的元素,我的index为range(0,n)出发,首先考虑每轮确定一个元素在其最终位置,所以比较范围应该动态变换,设定i为range(0,n-index),这个是针对自小到大的排序,每轮找出最大的元素,lis[i-1]>lis[i],两者交换位置。为了使已经有序的序列不用继续比较,设置一个flag,这个flag位置放在哪,如果你不熟悉,那也白给。
1 | # -*- coding:utf-8 -*- |