经典排序算法分析对比(python实现)

# 冒泡排序 O(n^2)
#本地排序
def bobble_sort(arr):  
    n = len(arr)
    for i in range(n-1):                    # 遍历n-1次
        for j in range(i+1,n):              # 每次遍历中,与首位比较n-i次
            if arr[i]>arr[j]:               # 比较后,符合条件就立刻进行交换
                arr[i],arr[j]=arr[j],arr[i]

# 选择排序 O(n^2)
#本地排序
def select_sort(arr):
    n = len(arr)
    for i in range(n-1):                    # 遍历n-1次
        min_index = i                       # 每次遍历开始初始化min_index=i
        for j in range(i+1,n):              # 每次遍历中,依次与arr[min_index]比较
            if arr[min_index]>arr[j]:        # 比较后,符合条件就更新min_index值
                min_index = j
        arr[i],arr[min_index]=arr[min_index],arr[i]# 每次遍历后进行交换
        
# 插入排序 O(n^2)
#本地排序
def insert_sort(arr):
    n = len(arr)
    for i in range(n-1):                    # 遍历n-1次(前i个元素已排好序)
        for j in range(i+1,0,-1):           # 每次遍历中,将第i+1个元素插入前面的数列
            if arr[j]<arr[j-1]:             # 从后向前寻找合适的插入位置
                arr[j],arr[j-1]=arr[j-1],arr[j]
            else:                           # 插入后退出for
                break

# 快速排序 O(nlogn)
#本地排序
def quick_helper(a,left,right):
    if left >= right:  # 递归终止
        return
    i = left
    j = right
    key = a[left]  # 取第一个元素为参考
    while i < j:  # 结束时,i=j,a[i]=key,左侧均≤key,右侧均≥key
        while i < j and a[j] > key:  # 从右向左找到比key小的数
            j -= 1
        if i < j:  # 把找到的数放到左侧空位
            a[i] = a[j]
            i += 1
        while i < j and a[i] < key:  # 从左向右找到比key大的数
            i += 1
        if i < j:  # 把找到的数放到右侧空位
            a[j] = a[i]
            j -= 1
    a[i] = key  # 把key放到中间位置
    quick_helper(a, left, i - 1)  # 排序左侧
    quick_helper(a, i + 1, right)  # 排序右侧

def quick_sort(arr):
    left = 0
    right = len(arr)-1
    return quick_helper(arr,left,right)

# 归并排序 O(nlogn)
#非本地排序
def merge_sort_helper(arr,left,right):
    if left<right:
        mid = left+(right-left)//2
        merge_sort_helper(arr,left,mid)
        merge_sort_helper(arr, mid+1, right)
        merge(arr,left,mid,right)
def merge(arr,left,mid,right):
    left_i=left
    right_i=mid+1
    temp_arr = []
    while  left_i<=mid and right_i<=right:
        left_value = arr[left_i]
        right_value = arr[right_i]
        if left_value<right_value:
            temp_arr.append(left_value)
            left_i+=1
        else:
            temp_arr.append(right_value)
            right_i+=1
    while left_i<=mid:
        temp_arr.append(arr[left_i])
        left_i += 1
    while right_i<=right:
        temp_arr.append(arr[right_i])
        right_i += 1
    index_i = left
    for v in temp_arr:
        arr[index_i]=v
        index_i+=1
def merge_sort(arr):
    merge_sort_helper(arr,0,len(arr)-1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值