排序算法-Python语言(未完待续)

排序算法总体介绍

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。

评判排序算法复杂度的两个基本特征:

  1. 时间复杂度:指执行算法所需要的时间量。
  2. 空间复杂度:指执行算法所需要的内存量。

根据算法复杂度的大致分类:
这里写图片描述

一、简单排序算法

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次就可以完成插入排序到首部位置,进而取得优化效果。

实现

2、堆排序

原理
实现

3、归并排序

原理
实现

4、快速排序

原理
实现

猜你喜欢

转载自blog.csdn.net/MrNoboday/article/details/81514653