题目均采用python进行完成
希尔排序
进化版本的插入排序
def shell_sort(num):
length = len(num)
group = len(num)
while group > 0:
for i in range(group, length):
for j in range(i, group - 1, -group):
if num[j - group] > num[j]:
num[j], num[j - group] = num[j - group], num[j]
if group == 2:
group = 1
else:
group = group // 2
return num
计数排序
适合 数组比较集中,有重复的排序
时间复杂度为 O(n) 空间复杂度是比较值得考虑的
def count_sort(num):
maxitem, minitem = num[0], num[0]
# 找寻最大最小值
for i in range(1, len(num)):
if num[i] > maxitem:
maxitem = num[i]
elif num[i] < minitem:
minitem = num[i]
# 建立抽屉
n = maxitem - minitem + 1
counts = [0] * n
for i in range(len(num)):
counts[num[i] - minitem] = counts[num[i] - minitem] + 1
# 放数
pos = 0
for i in range(n):
for j in range(counts[i]):
num[pos] = i + minitem
pos += 1
return num
归并排序
分而治之,先分成每一小组,每个小组进行排序,再合并进行排序,重点是了解递归的想法。
改进:每个小组采用插入排序,提高速度 == python里面的sort()所采用的方法
时间复杂度:O(nlgn)
def _merge_sort(a, b):
# 存放
c = []
while len(a) > 0 and len(b) > 0:
if a[0] < b[0]:
c.append(a[0])
a.remove(a[0])
else:
c.append(b[0])
b.remove(b[0])
if len(a) == 0:
c += b
else:
c += a
return c
def _merge(num):
# 分成小数组
if len(num) <= 1:
return num
m = len(num) // 2
a = _merge(num[:m])
b = _merge(num[m:])
return _merge_sort(a, b)
def merge_sort(num, reverse = False):
num = _merge(num)
if reverse:
num = num[::-1]
return num
快速排序
选定一个点,分区,比选定点小的,放在左侧,大的放在右侧,递归。
时间复杂度: O(nlgn)
选择 点 很重要
三点中值算法
不需要额外的空间
def _quick_sort(num):
# 结束条件
if len(num) <= 1:
return num
# 左右排序
pivot = num[0]
left_num = [x for x in range(1, len(num)) if x < pivot]
right_num = [x for x in range(1, len(num)) if x > pivot]
return left_num + [pivot] + right_num
def quick_sort(num, reverse = False):
num = _quick_sort(num)
if reverse:
num = num[::-1]
return num
l = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
l = quick_sort(l, reverse=True)
print(l)