
python 排序算法
1 插入排序
1.1 直接插入排序
算法思想
直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。
因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成:
-
第一层循环:遍历待比较的所有数组元素
-
第二层循环:将本轮选择的元素(selected)与已经排好序的元素(ordered)相比较。如果:selected > ordered,那么将二者交换
#直接插入排序 def insert_sort(L): #遍历数组中的所有元素,其中0号索引元素默认已排序,因此从1开始 for x in range(1,len(L)): #将该元素与已排序好的前序数组依次比较,如果该元素小,则交换 #range(x-1,-1,-1):从x-1倒序循环到0 for i in range(x-1,-1,-1): #判断:如果符合条件则交换 if L[i] > L[i+1]: L[i] ,L[i+1] = L[i+1],L[i] return L
1.2 希尔排序
算法思想
希尔排序在数组中采用跳跃式分组的策略,通过某个增量(gap初始值一般为len(元素长度)//2)将数组元素划分为若干组,然后分组进行插入排序,这算是一趟排序,(下一趟)随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。
解法1:
def shell_sort(alist):
"""希尔排序"""
n = len(alist)
gap = n // 2
while gap >= 1:
for j in range(gap, n):
i = j
while (i - gap) >= 0:
if alist[i] < alist[i - gap]:
alist[i], alist[i - gap] = alist[i - gap], alist[i]
i -= gap
else:
break
gap //= 2
if __name__ == '__main__':
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print("原列表为:%s" % alist)
shell_sort(alist)
print("新列表为:%s" % alist)
解法2:
def shell_sort(alist):
gap = len(alist)
while gap > 1:
gap = gap // 2
for i in range(gap, len(alist)):
for j in range(i % gap, i, gap):
if alist[i] < alist[j]:
alist[i], alist[j] = alist[j], alist[i]
return alist
alist = shell_sort([4,5,6,7,3,2,6,9,8])
print (alist)
2. 选择排序
2.1 简单选择排序
选择排序不受输入数据的影响,即在任何情况下时间复杂度不变。选择排序每次选出最小的元素,因此需要遍历 n-1 次。
def selectionSort(nums):
for i in range(len(nums) - 1): # 遍历 len(nums)-1 次
minIndex = i
for j in range(i + 1, len(nums)):
if nums[j] < nums[minIndex]: # 更新最小值索引
minIndex = j
nums[i], nums[minIndex] = nums[minIndex], nums[i] # 把最小数交换到前面
return nums
2.2 堆排序
堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
- 大根堆:每个节点的值都大于或等于其子节点的值,用于升序排列;
- 小根堆:每个节点的值都小于或等于其子节点的值,用于降序排列。
参考
(1).https://blog.csdn.net/mxz19901102/article/details/80087596
(2).https://www.jianshu.com/p/bbbab7fa77a2