Skip to content

Python算法实践Week5-排序算法

Hsinyan
Updated date:
1 min read

0x01 选择排序

排序是计算机最为常见的操作之一,排序就是将一组杂乱无章的数据按照一定的规律排序起来(递增或递减),排序的对象可以是数字型,也可以是字符型(按照ASCII码的顺序排列)

选择排序

# 选择排序
list = [49, 38, 65, 97, 76, 13, 27, 49]
for i in range(len(list) - 1):
    m = i
    for j in range(i + 1, len(list)):
        if list[j] < list[m]:
            m = j
    list[i], list[m] = list[m], list[i]
print(list)

0x02 冒泡排序

冒泡排序

list = [77, 42, 35, 10, 22, 101, 5]
for i in range(len(list) - 1):
    for j in range(len(list) - 1 - i):
        if list[j] > list[j + 1]:
            list[j], list[j + 1] = list[j + 1], list[j]
print(list)
# 改进
list = [77, 42, 35, 10, 22, 101, 5]
for i in range(len(list) - 1):
    flag = True
    for j in range(len(list) - 1 - i):
        if list[j] > list[j + 1]:
            list[j], list[j + 1] = list[j + 1], list[j]
            flag = False
    if flag:
        break
print(list)

0x03 函数、递归

# 自定义函数的定义
def 函数名([形参列表]):
    函数体
# 函数的调用
函数名([实参列表])
# 例子:定义一个求平均值的函数
def average(a, b):
    return (a + b / 2)
temp = average(1, 3)
print(temp)
import math
def isPrime(a):
    m = int(math.sqrt(a))
    for i in range(2, m + 1):
        if a % i == 0:
            return False
    return True
for i in range(2, 200):
    if isPrime(i):
        print(i)
def bubbleSort(a):
    for i in range(len(a) - 1):
        for j in range(len(a) - 1 - i):
            if a[j] > a[i]:
                a[j], a[i] = a[i], a[j]
list = [77, 42, 35, 10, 22, 101, 5]
bubbleSort(list)
print(list)
# 非递归方法
def factorial(n):
    s = 1
    for i in range(1, n + 1):
        s = s * i
    return s
# 递归方法
def factorial(n):
    if n == 1:
        return 1
    else:
        s = n * factorial(n - 1)
        return s
print(factorial(3))

0x04 归并排序

def merge(left, right):  # 合并两个列表
    merged = []
    i, j = 0, 0  # i和j分别作为left和right的下标
    left_len, right_len = len(left), len(right)  # 分别获取左右列表的长度
    while i < left_len and j < right_len:  # 循环归并左右子列表元素
        if left[i] <= right[j]:
            merged.append(left[i])  # 归并左子列表元素
            i += 1
        else:
            merged.append(right[j])  # 归并右子列表元素
            j += 1
    merged.extend(left[i:])  # 归并左子列表剩余元素
    merged.extend(right[j:])  # 归并右子列表剩余元素
    print(left, right, merged)  # 跟踪调试
    return merged  # 返回归并好的列表
def mergeSort(a):  # 归并排序
    if len(a) <= 1:  # 空或者只有一个元素,直接返回列表
        return a
    mid = len(a) // 2  # 列表中间位置
    left = mergeSort(a[:mid])  # 归并排序左子列表
    right = mergeSort(a[mid:])  # 归并排序右子列表
    return merge(left, right)  # 合并排好序的左右两个子列表
a = [98, 23, 11, 10, 33, 42]
temp = mergeSort(a)
print(temp)

python语言系统提供的排序算法,底层就采用了归并排序算法实现

a = sorted([24, 8, 10, 35])
print(a)
# [8, 10, 24, 35]
a.sort(reverse=True)
print(a)
# [35, 24, 10, 8]
b = sorted(a)
print(b)
# [8, 10, 24, 35]
c = sorted(a, reverse=True)
print(c)
# [35, 24, 10, 8]
Previous
Python算法实践Week4-查找算法
Next
Python算法实践Week6-树