一、排序算法的稳定性
1. 概念

例如:如果订单默认按照时间排序,需要按照金额排序,就要保证相同金额的订单原来的时间顺序不会变化;
2. 不稳定排序
(不相邻两数比较) 选择 快速 希尔 堆
3. 稳定排序
(相邻两数依次比较) 冒泡 插入 归并 基数
4. 衡量标准
- 时间复杂度:最好/最坏
 - 空间复杂度:原地排序(O(1))
 
5. 排序算法总结

二、冒泡排序
1. 定义

2. 动画演示:

3. 代码实现
def bubble_sort(l):
    n = len(l)
    # 外层循环控制轮数
    
    for i in range(n-1):
        count = 0
        # 内层循环控制每轮比较的次数
        
        for j in range(n-1-i):
            if l[j] > l[j+1]:
                count += 1
                l[j], l[j+1] = l[j+1], l[j]
    print(l)
bubble_sort([6,5,4,3,2,1])
4.效率分析
- 时间复杂度
    
- 最好:O(n)
 - 最坏:O(n2)
 
 - 
    
稳定性:稳定算法
 - 空间复杂度:O(1), 为原地排序
 
三、选择排序
1. 定义

2. 动画演示:

3. 代码实现
def select_sort(l):
    n = len(l)
    # 第一层循环控制迭代轮数
    
    for i in range(0, n-1):
        mix_index = i
        # 第二层循环控制比较次数
        
        for j in range(i+1, n):
            if l[mix_index] > l[j]:
                mix_index = j
        if mix_index != i:
            l[mix_index], l[i] = l[i], l[mix_index]
    print(l)
select_sort([1,2,3,6,5,4])
4. 效率分析
- 时间复杂度: 最好O(n2) 最坏O(n2)
 - 稳定性:不稳定算法,例如5 8 5 2(因算法而异)
 - 空间复杂度:O(1), 为原地排序
 
三、插入排序
1. 定义

2. 动画演示:

3. 代码实现
def insert_sort(l):
    n = len(l)
    # 第一层循环控制轮数
    for i in range(1, n):
        # 第二层循环控制每一轮比较次数
        
        for j in range(i, 0, -1):
            if l[j] < l[j-1]:
                l[j], l[j-1] = l[j-1], l[j]
            else:
                break
    print(l)
insert_sort([6,5,4,3,2,1])
4. 效率分析
- 时间复杂度:最好 O(n) 最坏 O(n2)
 - 空间复杂度:O(1)
 - 稳定性:稳定
 
四、快速排序
1. 定义

2. 动画演示

3. 代码实现
def quick_sort(l, start, end):
    left = start
    right = end
    if end <= start:
        return
    mid = l[start]
    while start < end:
        while l[end] >= mid and start < end:
            end -= 1
        l[start] = l[end]
        while l[start] < mid and start < end:
            start += 1
        l[end] = l[start]
    l[start] = mid
    quick_sort(l, left, start-1)
    quick_sort(l, start + 1, right)
l = [1,2,3,6,5,4,3,3,3]
quick_sort(l, 0, len(l)-1)
print(l)
4. 效率分析
- 时间复杂度:
    
- 最差 O(n2)
  

 - 最好 O(nlogn)
  

 
 - 最差 O(n2)
  
 - 
    
算法稳定性:不稳定
 - 空间复杂度:O(1) 原地排序