选择排序(升序)【不稳定排序】。
原理:
以 list = [5, 4, 2, 1, 3] 为例:
第一次排序后: [1, 4, 2, 5, 3]
第二次排序后: [1, 2, 4, 5, 3]
第三次排序后: [1, 2, 3, 5, 4]
第四次排序后: [1, 2, 3, 4, 5]
时间复杂度:O(n**2)
空间复杂度:O(1)
算法实现:
def select_sort(lists):
'''
:param lists:
:return: lists
'''
count = len(lists)
for i in range(0, count):
min = i
for j in range(i + 1, count):
if lists[min] > lists[j]:
min = j
lists[min], lists[i] = lists[i], lists[min]
return lists
# 调用选择排序
select_sort_list = select_sort(lis)
print(select_sort_list)
插入排序(升序)【稳定排序】。
原理:
以 list = [5, 4, 2, 1, 3] 为例:
第一步,插入5之后: [5], 4, 2, 1, 3
第二步,插入4之后: [4, 5], 2, 1, 3
第三步,插入2之后: [2, 4, 5], 1, 3
第四步,插入1之后: [1, 2, 4, 5], 3
第五步,插入3之后: [1, 2, 3, 4, 5]
时间复杂度: O(n) ~ O(n**2) 平均: O(n**2)
空间复杂度: O(1)
算法实现:
def insert_sort(lists):
'''
:param lists:
:return: lists
'''
count = len(lists)
for i in range(1, count):
key = lists[i]
j = i - 1
while j >= 0:
if lists[j] > key:
lists[j+1] = lists[j]
lists[j] = key
j -= 1
return lists
# 调用插入排序
insert_sort_list = insert_sort(lis)
print(insert_sort_list)
冒泡排序(升序)【稳定排序】
原理:
以 list = [5, 4, 2, 1, 3] 为例:
第一轮排序: [4, 2, 1, 3, 5]
第二轮排序: [2, 1, 3, 4, 5]
第三轮排序: [1, 2, 3, 4, 5]
时间复杂度: O(n) ~ O(n**2) 平均:O(n**2)
空间复杂度: O(1)
算法实现:
def bubble_sort(lists):
'''
:param lists:
:return lists:
'''
for i in range(len(lists)-1):
for j in range(len(lists)-i-1):
if lists[j] > lists[j+1]:
lists[j], lists[j+1] = lists[j+1], lists[j]
return lists
# 调用冒泡排序
bubble_sort_list = bubble_sort(lis)
print(bubble_sort_list)
归并排序(升序)【稳定排序】
原理:
利用分治法和递归法去解决问题。
时间复杂度:O(nlogn)
空间复杂度:O(1)
算法实现:
def merge(left, right):
i, j = 0, 0
result = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
def merge_sort(lists):
'''
:param lists:
:return lists:
'''
if len(lists) <= 1:
return lists
num = len(lists) / 2
left = merge_sort(lists[:num])
right = merge_sort(lists[num:])
return merge(left, right)
# 调用归并排序
merge_sort_list = merge_sort(lis)
print(merge_sort_list)
快速排序(升序)【不稳定】
原理:
分治递归,给定一组序列,把序列分为两部分,前部分的所有元素比后部分的所有元素均有序为止。
分三步走:
算法实现:
def quick_sort(lists, left, right):
'''
:param lists:
:param left:
:param right:
:return lists:
'''
if left >= right:
return lists
key = lists[left]
low = left
high = right
while left < right:
while left < right and lists[right] >= key:
right -= 1
lists[left] = lists[right]
while left < right and lists[left] <= key:
left += 1
lists[right] = lists[left]
lists[right] = key
quick_sort(lists, low, left - 1)
quick_sort(lists, left + 1, high)
return lists
# 快速排序调用
quick_sort_list = quick_sort(lis, 0, len(lis) - 1)
print(quick_sort_list)
希尔排序(升序)【不稳定排序】。
原理:
也叫缩小增量排序,将待排序列分成多个子序列,每个子序列元素个数相对较少,对各个子序列分别进行直接插入排序,待整个排序序列"基本有序后",再对所有元素进行一次直接插入排序。
时间复杂度:O(nlogn) 最差 O(n**s)(1
空间复杂度:O(1)
算法实现:
def shell_sort(lists):
'''
:param lists:
:return lists:
'''
count = len(lists)
step = 2
group = int(count / step)
while group > 0:
for i in range(0, group):
j = i + group
while j < count:
k = j - group
key = lists[j]
while k >= 0:
if lists[k] > key:
lists[k + group] = lists[k]
lists[k] = key
k -= group
j += group
group /= step
return lists
# 希尔排序调用
shell_sort_list = shell_sort(lis)
print(shell_sort_list)
堆排序(升序)【不稳定排序】
原理:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
步骤:
时间复杂度:O(nlogn)
算法实现:
def adjust_heap(lists, i, size):
lchild = 2 * i + 1
rchild = 2 * i + 2
maxs = i
if i < size / 2:
if lchild < size and lists[lchild] > lists[maxs]:
maxs = lchild
if rchild < size and lists[rchild] > lists[maxs]:
maxs = rchild
if maxs != i:
lists[maxs], lists[i] = lists[i], lists[maxs]
adjust_heap(lists, maxs, size)
def build_heap(lists, size):
for i in range(0, (size / 2))[::-1]:
adjust_heap(lists, i, size)
def heap_sort(lists):
'''
:param lists:
:return lists:
'''
size = len(lists)
build_heap(lists,size)
for in range(0, )[::-1]:
lists[0], lists[i] = lists[i], lists[0]
adjust_heap(lists,0,i)
# 堆排序调用
heap_sort_list = heap_sort(lis)
print(heap_sort_list)
基数排序(桶排序)(升序)【稳定性排序】
基数排序(radix sort)属于"分配式排序"(distribution sort),又称"桶子法"(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些"桶"中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
时间复杂度:O(nlog(r)m) r是基数,m是堆数
算法实现:
import math
def radix_sort(lists, radix=10):
'''
:param lists:
:param radix:
:return lists:
'''
k = int(math.ceil(math.log(max(lists),radix))
bucket = [[] for i in range(radix)]
for i in range(1,k+1):
for j in lists:
bucket[j/(radix**(i-1) % (radix**i)].append(j)
del lists[:]
for z in bucket:
lists += z
del z[:]
return lists