思路:从第一个元素开始,将它与下一个索引元素比较。如果当前元素的值比下一个元素的值要大,则两者交换位置,否则位置不变。
举例说明:arr = [1,3,2,4,8,5]
第一轮:
第一次比较1和3:因为1<3,所以不交换。原始数组arr=[1,3,2,4,8,5]
第二次比较3和2:因为3>2,所以交换。原始数组arr=[1,2,3,4,8,5]
第三次比较3和4:因为3<4,所以不交换。原始数组arr=[1,2,3,4,8,5]
第四次比较4和8:因为4<8,所以不交换。原始数组arr=[1,2,3,4,8,5]
第五次比较8和5:因为8>5,所以交换。原始数组arr=[1,2,3,4,5,8]
第一轮结束后,arr列表中的最后一个数字最大。第二轮重复和第一轮一样的过程,到倒数第二个位置结束,使得倒数第二个位置第二大,以此类推,直到使得整个列表有序。
通过这个例子我们可以看到,因为列表中包含着6个数据,所以冒泡排序一共会比较6轮,每一轮会比较5次,第二轮会比较4次,第三轮会比较3次……
所以当有n个数据的时候,冒泡排序一共会比较n轮,每轮会比较n-i次(i表示轮数)
第一轮结束后,使得列表中1至n位置中n位置上的值最大,也就是使得最后一个位置有序。
第二轮结束后,使得列表中1至n-1位置中n-1位置上的值最大,也就是使得最后两个位置有序。
第三轮结束后,使得列表中1至n-2位置中n-2位置上的值最大,也就是使得最后三个位置有序。
def maopao(arr):
if len(arr)<2 or arr is None:
return arr
for i in range(len(arr)):
#每一轮比较的次数,且使得最后一个数的值最大
for j in range(len(arr)-i-1):
if arr[j]>arr[j+1]:
arr[j],arr[j+1]=arr[j+1],arr[j]
return arr
思路:从整个待排序列中选出一个元素插入到已经有序的子序列中去,得到一个有序的、元素加一的子序列,直到整个序列的待插入元素为0,则整个序列全部有序。
举例:arr = [1,3,2,4,8,5]
第一轮使得0-0范围有序,因为0-0范围内只有一个元素,所以默认有序。此时arr = [1,3,2,4,8,5]
第二轮使得0-1范围有序,也就是使得1,3有序,比较0号位置和1号位置的值,如果0号位置的值大则交换。此时arr = [1,3,2,4,8,5]
第三轮使得0-2范围有序,也就是使得1,3,2有序。第一次比较3和2,因为3>2,所以交换位置,第二次比较1和2,因为1<2,所以不用交换位置。此时arr = [1,2,3,4,8,5]
第四轮使得0-3范围有序,也就是使1,2,3,4有序……依次类推
所以当有n个数据时,第一次使得0-1范围有序,第二次使得0-2范围有序,第三次使得0-3范围有序,直到使得0-(n-1)范围有序。
这个过程很像我们斗地主时,先拿第一张牌,然后再拿第二张牌使得手里的牌有序,然后再拿第三张牌,看一下要插入到牌的哪个位置,使得手里的牌有序……
def charu(arr):
if len(arr)<2 or arr is None:
return arr
for i in range(1,len(arr)):
#第一轮使得0-1有序
#第二轮使得0-2有序
#第三轮使得0-3有序
j=i-1
while j>=0 and arr[j]>arr[j+1]:
arr[j],arr[j+1]=arr[j+1],arr[j]
j=j-1
return arr
如有列表[5,2,1,3,9]
思路:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放待排序序列的起始位置(或末尾位置),直到全部待排序的数据元素排完。
举例说明:
arr = [1,3,2,4,8,5]
第一轮,使得0到n-1范围中的最小值放在0号位置,此时arr = [1,3,2,4,8,5]
第二轮,使得1到n-1范围中的最小值放在1号位置,此时arr = [1,2,3,4,8,5]
第三轮,使得2到n-1范围中的最小值放在2号位置,此时arr = [1,2,3,4,8,5]
……
以此类推,直到整个列表有序
如有列表[5,2,1,3,9]
def xuanze(arr):
if len(arr)<2 or arr is None:
return arr
for i in range(len(arr)):
minindex=i
for j in range(i,len(arr)):
if arr[minindex]>arr[j]:
minindex=j
arr[minindex],arr[i]=arr[i],arr[minindex]
return arr