东阳的学习记录,坚持就是胜利
常见的排序算法
- 插入排序:(直接插入排序,折半插入排序,希尔排序)
- 交换排序:(冒泡排序,快速排序)
- 选择排序:(简单选择排序,堆排序)
- 2路归并排序
- 基数排序:(不基于比较的排序算法)
- 外部排序:(多路归并排序算法)
各种排序算法的比较
其中希尔排序只适用于线性表为顺序存储的情况。
插入排序
插入排序(英语:Insertion Sort)是一种简单直观的排序算法。其基本思想是每次将一个待排序的记录按其关键字大小插入到已排好序的子序列中,直到全部记录插入完成。
由插入排序的思想可以引申出三个重要的排序算法:直接插入排序、折半插入排序和希尔排序。
直接插入排序(稳定,适用于顺序存储和链式存储)
由于python中可以执行,a, b = b, a,好像实现起来更简单了
# c风格
def insert_sort(alist):
# 从第二个位置,即下标为1的元素开始向前插入
for i in range(1, len(alist)):
# 如果小于其前驱,则需要插入有序表
# 否则,无需操作
if(alist[i] < alist[i - 1]):
temp = alist[i]
alist[i] = alist[j]
j = j -1
while j >= 0 and alist[j] > temp:
alist[j+1] = alist[j]
j = j - 1
alist[j+1] = temp
# python风格
def insert_sort(alist):
# 从第二个位置,即下标为1的元素开始向前插入
for i in range(1, len(alist)):
# 从第i个元素开始向前比较,如果小于前一个元素,交换位置
for j in range(i, 0, -1):
if alist[j] < alist[j-1]:
alist[j], alist[j-1] = alist[j-1], alist[j]
else:
break
折半插入排序(稳定,只适用于顺序表)
折半查找的插入位置为low???记住比较好,总是弄错
def insertion_sort_binarysearch(a_list):
"""折半排序"""
for index in range(1,len(a_list)):
current_value = a_list[index]
position = index
# 折半查找过程
low = 0
high = index - 1
while low <= high:
mid = (low + high) // 2
if a_list[mid] > current_value:
high = mid - 1
else:
low = mid + 1
# 找到插入位置low
while position > low:
a_list[position] = a_list[position - 1]
position = position - 1
a_list[position] = current_value
希尔排序(不稳定,只使用于顺序表)
希尔排序又叫缩小增量排序,其基本思想是:先将待排序表分割成若干形如L[i, i + d, i + 2d, …, i + kd]的特殊子表,分别进行直接插入排序,当整个表中的元素已呈“基本有序”时,再对全体记录进行一次直接插入排序。
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