defshell_sort(a):"""
希尔排序 时间复杂度 o(nlogn) or o(n^(1.3—2))
希尔排序是把记录按下标的一定增量分组,
对每组使用直接插入排序算法排序;
随着增量逐渐减少,每组包含的关键词越来越多,
当增量减至1时,整个文件恰被分成一组,算法便终止
:param a:list
:return:sorted(a)
"""
num =0
gap =len(a)while gap >1:
gap = gap //2## 取商for i inrange(gap,len(a)):for j inrange(i % gap, i, gap):if a[i]< a[j]:
a[i], a[j]= a[j], a[i]print(' %s和 %s互换位置, %s -->> %s '%(a[i], a[j], a[i], a[j]))
num +=1print('移动次数: %s 次'% num)print(a)return a
快速排序
defquick_sort(a):"""
快速排序 时间复复杂度nlogn
通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,
以此达到整个数据变成有序序列
:param a:list
:return:sorted(a)
"""if a ==[]:return a
else:
a_first = a[0]
a_less = quick_sort([i for i in a[1:]if i < a_first])
a_more = quick_sort([j for j in a[1:]if j > a_first])
result = a_less +[a_first]+ a_more
return result
defradix_sort(a):"""
基数排序 时间复杂度 o(LOGrB)
透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用
:param a:list
:return:sort(a)
"""
bucket, digit =[[]],0whilelen(bucket[0])!=len(a):
bucket =[[],[],[],[],[],[],[],[],[],[]]for i inrange(len(a)):
num =(a[i]//10** digit)%10
bucket[num].append(a[i])
a.clear()for i inrange(len(bucket)):
a += bucket[i]
digit +=1return a
归并排序
defmerge_sort(a):"""
归并排序 时间复杂度 nlogn
采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;
即先使每个子序列有序,再使子序列段间有序。
若将两个有序表合并成一个有序表,称为二路归并
:param a:list
:return:sorted(a)
"""defmerge(left, right):
result =[]## 保存归并后的结果
i = j =0while i <len(left)and j <len(right):if left[i]<= right[j]:
result.append(left[i])
i +=1else:
result.append(right[j])
j +=1
result = result + left[i:]+ right[j:]## 剩余的元素直接添加到末尾return result
## 递归过程iflen(a)<=1:return a
mid =len(a)//2
left = merge_sort(a[:mid])
right = merge_sort(a[mid:])return merge(left, right)