python算法,排序

# 时间复杂度


print("Hello world")  # O(1)


for i in range(n):
    print("Hello world")  # O(n)


for i in range(n):
    for j in range(n):
        print("Hello world")  # O(n ** 2)


for i in range(n):
    for j in range(n):
        for k in range(n):
            print("Hello world")  # O(n ** 3)


for i in range(n):
    for j in range(i):
            print("Hello world")  # O(n ** 2)


n = 64
while n > 1:
    print(n)
    n = n // 2  # O(logn) 
# 循环减半的过程O(logn)


# 时间复杂度排序
# O(1) < O(logn) < O(n) < O(nlogn) < O(n ** 2) < O(n ** 2 logn) < o(n ** 3)






####
"""冒泡排序 选择排序 插入排序"""




# 冒泡排序
# 时间复杂度 O(n ** 2)


def bubble_sort(li):
    # 冒泡排序
    for i in range(len(li) - 1):
        for j in range(len(li) - i - 1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]




# 冒泡排序优化
# 如果一次排序中无数据交换,跳出排序


def bubble_sort(li):
    for i in range(len(li) - 1):
        exchange = False
        for j in range(len(li) - i - 1):
            if li[j] > li[j + 1]:
                li[j], li[j + 1] = li[j + 1], li[j]
                exchange = True
        if not exchange:
            break




# 冒泡排序测试


import random
data = list(range(1000))
random.shuffle(data)  # 打乱列表
print(data)
bubble_sort(data)
print(data)




# 选择排序
# 时间复杂度 O(n ** 2)


def select_sort(li):
    # 选择排序
    for i in range(len(li) - 1):
        min_loc = i
        for j in range(i + 1, len(li)):
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[j]




# 插入排序
# 时间复杂度 O(n ** 2)


def insert_sort(li):
    # 插入排序
    for i in range(1, len(li)):
        tmp = li[i]
        j = i - 1
        while j >= 0 and li[j] > tmp:
            li[j + 1] = li[j]
            j = j - 1
        li[j + 1] = tmp




####
"""快速排序
选择第一个元素,从数组right向左找第一个小于它的元素,交换位置。然后left向右找第一个大于它的元素交换位置。循环,直到左右游标重合。"""




# 快速排序
# 时间复杂度O(nlogn)
def quick_sort(data, left, right):
    # 快速排序
    if left < right:
        mid = partition(data, left, right)
        quick_sort(data, left, mid - 1)
        quick_sort(data, mid + 1, right)




def partition(data, left, right):
    tmp = data[left]
    while left < right:
        while left < right and data[right] >= tmp:
            right -= 1
        data[left] = data[right]
        while left < right and data[left] <= tmp:
            left +=1
        data[right] = data[left]
    data[left] = tmp
    return left




"""堆排序
通过完全二叉树,使得每一个根节点大于子节点,从二叉树中提取元素进行排序。
父节点与左子节点关系i <=> 2i+1
父节点与右子节点关系i <=> 2i+2"""




# 堆排序
def sift(data, low, high):
    # 选择
    i = low        # 父节点
    j = 2 * i + 1  # 左子节点
    tmp = data[i]
    while j <= high:                            # 只要节点还在树里
        if j < high and data[j] < data[j + 1]:  # 左子节点和右子节点比较
            j += 1             # 右子节点大,j替换成右子节点
        if tmp < data[j]:      # 子节点比根节点大
            data[i] = data[j]  # 子节点填到父节点位置
            i = j              # 子节点成为父节点
            j = 2 * i + 1      # 新子节点
        else:
            break
    data[i] = tmp  # 根节点放到父节点位置




def heap_sort(data):
    # 堆排序
    n = len(data)
    for i in range(n // 2 - 1, -1, -1):      # 每一个堆
        sift(data, i, n - 1)                 # 父节点到堆的最后节点
    for i in range(n - 1, -1, -1):           # i指向堆最后
        data[0], data[i] = data[i], data[0]  # 根节点和最后换位
        sift(data, 0, i - 1)                 # 调整出新排序




# 堆排序测试
data = list(range(10000))
random.shuffle(data)  # 打乱列表
print(data)
heap_sort(data)
print(data)



















Python 中,有多种排序算法可以用来对数据进行排序。下面我将详细解释几种常见的排序算法及其实现。 1. 冒泡排序(Bubble Sort): 冒泡排序是一种简单的比较排序算法,它重复地比较相邻的元素,并将较大的元素逐步向右移动。具体实现如下: ```python def bubble_sort(arr): n = len(arr) for i in range(n - 1): for j in range(n - 1 - i): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] return arr ``` 2. 插入排序(Insertion Sort): 插入排序是一种简单直观的排序算法,它逐步构建有序序列,对于未排序部分的每个元素,将其插入到已排序序列的正确位置。具体实现如下: ```python def insertion_sort(arr): n = len(arr) for i in range(1, n): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr ``` 3. 选择排序(Selection Sort): 选择排序是一种简单直观的排序算法,它每次从未排序部分选择最小的元素,并将其放在已排序部分的末尾。具体实现如下: ```python def selection_sort(arr): n = len(arr) for i in range(n - 1): min_idx = i for j in range(i + 1, n): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr ``` 4. 快速排序(Quick Sort): 快速排序是一种高效的分治排序算法,通过选择一个基准元素,将序列分割成较小和较大的两个子序列,然后递归地对子序列进行排序。具体实现如下: ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` 这只是其中几种常见的排序算法,每种算法都有其适用的场景和性能特点。在实际应用中,可以根据数据规模和性能需求选择合适的排序算法。另外,Python 中还提供了内置的排序函数 `sorted()` 和列表方法 `sort()` 可以方便地进行排序操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值