Python实现常用排序算法 学习笔记

排序算法中的稳定性

  1. 相同的大小的元素在排序完成后相对位置没有发生改变,就是稳定的
  2. 稳定性对于排序一个复杂结构,并且需要保持原有的排序才有意义

快排

  1. 选择基准分割数组为两个字数组,小于基准和大于基准
  2. 对两个子数组排序
  3. 合并
  4. 时间复杂度 O(N*logN),空间使用了递归,O(logN)
  5. 不稳定
data = [2,4,5,2,1,7,8,5,3,9]

def quicksort(data):
    if len(data) < 2:   # 当数据只剩一个的时候就返回 
        return data

    datum_index = 0     # 去下标为0作为基准值
    left = []           # 小于基准值的数组
    right = []          # 大于基准值的数据
    for d in data[1:]:  # 从1开始遍历
        if d <= data[datum_index]: left.append(d)   
        else: right.append(d)
    return quicksort(left) + [data[datum_index]] + quicksort(right)  # 把基准值排序完的数据再进行排序

print(quicksort(data))  # 输出:[1, 2, 2, 3, 4, 5, 5, 7, 8, 9]

归并排序

  1. 把数组一半一半进行分割
  2. 合并两个有序的数组
  3. 时间复杂度:O(N*logN),空间复杂度:O(N)
  4. 不稳定
def merge_sorted(data_1, data_2):                       # 合并两个有序的数组
    if len(data_1) == 0 or len(data_2) == 0:            # 如果其中一个数组为空,可直接返回
        return data_1 + data_2
    left=right=0                                
    new_data = []
    while left < len(data_1) and right < len(data_2):   # 两个数组其中一个数据用完就退出循环
        if data_1[left] <= data_2[right]:
            new_data.append(data_1[left])
            left += 1
        else:
            new_data.append((data_2[right]))
            right += 1
    if left < len(data_1): new_data += data_1[left:]    # 若数组一还有剩余数据,补充
    if right < len(data_2): new_data += data_2[right:]  # 若数组二还有剩余数据,补充
    return new_data

def mergesort(data):                                    # 归并排序
    if len(data) <= 1:                                  # 若数组只有一个,已经有序,返回
        return data                                     

    mid = len(data)//2                                  # 获取中间切分下标
    left = mergesort(data[:mid])                        # 左边递归归并排序
    right = mergesort(data[mid:])                       # 右边递归归并排序
    return merge_sorted(left, right)                    # 把两个有序的数组合并

print(mergesort([1,5,6,7,8,9,10,1,2,3,4]))



冒泡排序

  1. 从第一位开始,依次与后面对比大小,大的进行交换,最后把数组后面是最大的元素
  2. 再从第一位开始,排倒数第二个,依次类推,排n次
  3. 时间复杂度:O(n**2)空间复杂度:O(1)
  4. 稳定
if __name__ == '__main__':
    data = [2,5,1,3,7,0,1,7,9,3,6]
    for index in range(len(data)):
        for index_2 in range(len(data[:-index])):
            if data[index_2] > data[index_2+1]:
                data[index_2], data[index_2+1] = data[index_2+1], data[index_2]
    print(data)

选择排序

  1. 从第一位开始,去找后面比第一位小的数,交换两个数,依次类推
  2. 时间复杂度:O(n**2),空间复杂度:O(1)
  3. 稳定
if __name__ == '__main__':
    data = [2,5,1,3,7,0,1,7,9,3,6]
    length = len(data)
    for index in range(len(data)):
        min_index = index
        for index_2 in range(index+1, length):
            if data[index_2] < data[min_index]:
                min_index = index_2
        data[index], data[min_index] = data[min_index], data[index]

    print(data)
发布了15 篇原创文章 · 获赞 4 · 访问量 1035

猜你喜欢

转载自blog.csdn.net/qq_37316153/article/details/104271220