排序算法总体介绍
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。
评判排序算法复杂度的两个基本特征:
- 时间复杂度:指执行算法所需要的时间量。
- 空间复杂度:指执行算法所需要的内存量。
根据算法复杂度的大致分类:
一、简单排序算法
1、冒泡排序
原理:
从末尾开始,重复依次比较相邻的元素,不断将小的元素上浮。
实现:
# 冒泡排序
def Bubble_sort(list):
ls = list
length = len(ls)
for i in range(length):
j = length - 2
while j >= i:
# 将数值较小的上浮
if ls[j] > ls[j+1]:
ls[j], ls[j+1] = ls[j+1], ls[j]
j -= 1
# 需要接收返回值
return ls
优化:
# 添加flag,实现冒泡优化
def bubble_sort_flag(list):
ls = list
length = len(ls)
for i in range(length):
# 设置flag为True
flag = True
j = length -2
while j >= i:
if ls[j] > ls[j+1]:
ls[j], ls[j+1] = ls[j+1], ls[j]
flag = False
j -= 1
# flag为真,则if条件一直不成立,则不需要继续冒泡
if flag:
break
return ls
2、选择排序
原理
重复遍历选出最小元素依次存放。
实现
# 选择排序
def select_sort(list):
ls = list
length = len(ls)
for i in range(length):
# 假定当前循环的最小值下标
min_index = i
for j in range(i+1, length):
if ls[min_index] > ls[j]:
# 不断更新最小值小标
min_index = j
if min_index != i:
# 将当前最小值提到i下标的位置
ls[i], ls[min_index] = ls[min_index], ls[i]
return ls
3、插入排序
原理
从list下标1不断选取之后的元素从后向前逐一挪动位置,直到合适位置为止。
实现
# 插入排序
def insert_sort(list):
ls = list
length = len(ls)
# 假定0号元素为有序部分,将之后元素逐一有序插入
for i in range(1, length):
for j in range(i, 0, -1):
# [0, i]从i开始向前比较
# 如果小于前一个元素,交换位置(局部冒泡)
if ls[j] < ls[j-1]:
ls[j-1], ls[j] = ls[j], ls[j-1]
return ls
二、改进算法
1、希尔排序
原理
希尔排序是插入排序的改进算法,通常插入排序会把大量时间花费在移动元素上,比如[2,5,7,8,1]要将’1’通过插入排序移动到首位,需要先和8交换位置,再和7交换,直到合适为止,交换了四次。希尔排序通过引入步长,将列表分割,如步长为2时分为[2,7,1]和[5, 8]分别排序此时’1’只需要交换2次就可以完成插入排序到首部位置,进而取得优化效果。