八大排序算法:
- 冒泡排序
- 插入排序
- 希尔排序
- 选择排序
- 堆排序
- 归并排序
- 快速排序
- 基数排序
排序稳定性:任意两个相等的数据,排序前后的相对位置不发生变化。
1.简单排序
冒泡排序
def Bubble_sort(lists):
count=len(lists)
for P in range(count-1,1,-1):
flag=0
for i in range(P):
if lists[i]>lists[i+1]:
tmp=lists[i+1]
lists[i+1]=lists[i]
lists[i]=tmp
flag=1
if flag==0:break
return lists
时间复杂度:
- 最好情况:原始数据顺序排列 T=O(N)
- 最坏情况:原始数据逆序排列 T=O(N^2)
优点:
- 当要排序的数据存储于链表中,冒泡排序也可以实现。
- 因为冒泡排序在前一个元素严格大于后一个时才交换,所以能保证稳定性。
插入排序
def Insert_sort(lists):
count=len(lists)
for P in range(1,count):
tmp=lists[P]
i=P
while i>0 and lists[i-1]>tmp:
lists[i]=lists[i-1]
i-=1
lists[i]=tmp
return lists
时间复杂度:
- 最好情况:原始数据顺序排列 T = O ( N ) T=O(N) T=O(N)
- 最坏情况:原始数据逆序排列 T = O ( N 2 ) T=O(N^{2}) T=O(N2)
优点:稳定
Remark:
- 逆序对:对于下标 i < j i<j i<j,如果 l i s t s [ i ] > l i s t s [ j ] lists[i]>lists[j] lists[i]>lists[j],则称 ( i , j ) (i,j) (i,j)是一对逆序对
- 交换两个相邻元素正好消去一个逆序对
- 插入排序时间复杂度 T ( N + I ) = O ( N + I ) T(N+I)=O(N+I) T(N+I)=O(N+I),其中 I I I为逆序对数
- 定理:任意 N N N个不同元素组成的序列平均具有 N ( N − 1 ) 4 \frac{N(N-1)}{4} 4N(N−1)个逆序对
- 推论:任何仅以交换相邻两元素来排序的算法,其平均时间复杂度为
Ω
(
N
2
)
\Omega(N^{2})
Ω(N2)
欲提高算法效率需
⇓ \Downarrow ⇓
每次消去不止一个逆序对
⇓ \Downarrow ⇓
每次交换间隔较远的2个元素
⇓ \Downarrow ⇓
希尔排序
希尔排序