1、冒泡排序
算法原理:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
def Bubble_list(self,list):
mlen = len(list)
while mlen>1:
index = 0
for r in range(mlen):
if list[index] > list[index + 1]:
list[index], list[index + 1] = list[index + 1], list[index]
index = index + 1
if index == mlen - 1:
break
mlen = mlen - 1
return list
更新于2019-12-2:
def bubble(list_a):
for j in range(len(list_a) - 1):
list_b = list_a[:len(list_a) - j]
for i in range(len(list_b) - 1):
if list_a[i] > list_a[i + 1]:
list_a[i], list_a[i + 1] = list_a[i + 1], list_a[i]
return list_a
2、选择排序
算法原理:
1、初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;
2、再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。
3、以此类推,直到所有元素均排序完毕。
#简易思路是:对于list中第i个数,找出i~len(list)-1中最小的数,并于第i个数交换位置,此次循环结束后,再寻找i+1~len(list)-1中最小的数,并于第i+1个数交换位置,以此类推
def select_sort(self,list):
'''选择排序'''
for i in range(len(list)):
min = i
for r in range(i,len(list)):
if list[min] > list[r + 1]:
min = r+1
if r == len(list) - 2:
break
list[i],list[min]=list[min],list[i]
if i == len(list) - 2:
break
return list
更新于2019-12-2:
def select(list_a):
for j in range(len(list_a)-1):
min_number = list_a[j]
for i in range(j, len(list_a)):
if list_a[i] < min_number:
min_number = list_a[i]
list_a[j], list_a[i] = list_a[i], list_a[j]
return list_a
3、插入排序
算法原理:
1、从第一个元素开始,该元素可以认为已经被排序
2、取出下一个元素,在已经排序的元素序列中从后向前扫描
3、如果该元素(已排序)大于新元素,将该元素移到下一位置
4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5、将新元素插入到该位置后
6、重复步骤2~5
插入排序分为;直接插入排序、二分法插入排序、链表插入排序、希尔排序
直接插入排序:
def Insert_sort_directly(self,list):
'''直接插入排序'''
for r in range(1,len(list)):
i=r
while list[r]
i=i-1
if i==0:
break
list.insert(i,list[r])
del list[r+1]
return list
更新于2019-12-2
def insert():
'''直接插入排序'''
for i in range(1, len(list_a)):
for j in (0,i):
if list_a[i]<=list_a[j]:
list_a.insert(j,list_a[i])
del list_a[i+1]
return list_a
二分法插入排序:
def Insert_sort_division(self,list):
'''二分法插入排序'''
if list[0]>list[1]: #由于二分法是在两个数的情况下比较,因此首先给list中前两位数排序
list[0],list[1]=list[1],list[0]
for r in range(2,len(list)):
i=r
lindex=0 #左边界
rindex=i-1 #右边界
while rindex-lindex!=1: #判断list[r]的区间,直至左边界和右边界为邻近边界
mindex=(lindex+rindex)/2
if list[r]>list[mindex]:
lindex=mindex
else:
rindex=mindex
if list[r]
list.insert(lindex,list[r])
elif list[r]>list[rindex]:
list.insert(rindex+1, list[r])
else:
list.insert(rindex,list[r])
del list[r+1]
return list
希尔排序:
先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。
def Insert_sort_shell(self,list):
'''希尔排序'''
def form_list(d,list):
'''将list按照增量d分割成若干个子序列'''
allList=[]
for r in range(d):
i=r
sublist = []
while i
sublist.append(list[i])
i=i+d
allList.append(sublist)
return allList
def sublist_sort(allList):
'''对每个子序列进行排序并还原原序列'''
list=[]
# 对子序列进行排序
for r in allList:
self.Insert_sort_directly(r)
#还原原来序列
i=0
while i
for r in allList:
if i > len(r) - 1:
continue
list.append(r[i])
i = i + 1
return list
d=len(list)/2
while d!=0:
allList=form_list(d,list)
list=sublist_sort(allList)
d=d/2
return list