第一趟 子列表仅包含第一个数据项 将第二个数据项 当作新项放到子列表的合适位置,这样已排序的子列表就包含了两个数据项
第二趟 再继续将第三个数据项 与前两个数据项进行对比 并移动比自身大的数据项,空出位置来 ,以便加到子列表中
经过n-1套对比和插入,子列表扩展到全表 排序完成
数量级 与最差情况 每一个 可能都进行对比,所以数量级O(n^2)
最好情况,列表已经排好序,每趟仅需要 一次对比 总数量级 O(n)
def insertSort(alist):for index in range(1,len(alist)):currentvalue= alist[index]position = indexwhile position >0 and alist[position-1] > currentvalue:alist[position] = alist[position-1]position = position-1alist[position] = currentvalue#
间隔有说时n/2开始 每趟倍增 n/4 n/8 …直到1
随着子列表的数量越来越少,无序表的整体越来越接近有序,从而减少整体排序的比对次数
间隔为3的子列表,子列表分别插入排序后的整体状况更接近有序
间隔逐渐减少,直到为1时 也就是最后一趟标准的插入排序
def shellSort(alist):Jiange= len(alist)//2while Jiange > 0:for startposition in range(Jiange):InsertSort(alist,startposition,Jiange)print("After increment")Jiange = Jiange//2
def InsertSort(alist,start,gap):
for i in range(start +gap,len(alist),gap):
current = alist[i]position= i
while position >= gap and alist[position-gap] >current:
alist[position] = alist[position-gap]
position = position -gapalist[position] = current // shell
粗看上去 谢尔排序以插入排序为基础,可能并不会比插入排序好
但由于每趟 都会使得 列表更加接近有序这过程会减少很多原先许哟啊的
无效比对
对谢尔排序的详尽分析比较负责 大致说时介于O(n) 和O(n2) 之间
def merge_sort(alist):
if len(alist) <=1:return alist
middle = len(alist) //2 #二分法
left = merge_sort( alist[:middle])
right = merge_sort( alist[middle:])# 合并左右半部,完成排序merged =[]
while left and right:
if left[0] <right[0]:
merged.append(left.pop[0])
merged.append(right.pop[0])
d(right if right else left)
return merged
归并排序是递归算法,思路是将数据表持续分裂为两半,对两半分别及逆行归并排序
分解 分裂 对每一部分 在对中间的递归排列
数据表中间的中位值 计算开销
递归排序 三要素
1)基本结束条件: 数据表仅有一个数据项,自然是排好序的
2)缩小规模 : 根据种植,将数据表分为两半,最好情况时相等规模的两半
3) 调用自身: 将两半分别调用自身进行排序( 排序基本操作在分裂过程中)
分裂数据表的目标:找到"中值"的位置
分裂数据表的手段
设置左右标(left/rightmark
坐标向右移动,右标向左移动
- 左标一直向右移动,碰到比中值大的就停止
*右标一直向左移动,碰到比中值小的就停止
*然后把左右标所指的数据项交换
继续移动,直到左标移到右标的右侧,停止移动,这时右标所知位置就是中值应处的位置
将中值和这个位置交换
分裂完成,左半部比中指小,右半部比中值大
本文发布于:2024-01-30 01:15:04,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170654850818188.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |