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
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
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]
二分法插入排序:
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[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 ilen(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